zoukankan      html  css  js  c++  java
  • MFC如何设置窗口最前

    首先,放到最前

    this->SetWindowPos(&wndTopMost,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);//使窗口总是在最前面
    this->SetWindowPos(&wndNoTopMost,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);//使窗口可以被其他窗口覆盖

    2、改变系统环境参数

    这些定义winuser.h里都有的

    #define SPI_GETFOREGROUNDLOCKTIMEOUT 0x2000
    #define SPI_SETFOREGROUNDLOCKTIMEOUT 0x2001
    #define SPIF_UPDATEINIFILE 0x0001
    #define SPIF_SENDWININICHANGE 0x0002

    先设置环境变量
    DWORD lockTime = 0;
    SystemParametersInfo(SPI_GETFOREGROUNDLOCKTIMEOUT, 0, &lockTime, 0);
    SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, 0, 
                         SPIF_SENDWININICHANGE | SPIF_UPDATEINIFILE);

    退出程序时还原环境变量

    SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, lockTime, SPIF_SENDWININICHANGE | SPIF_UPDATEINIFILE);

    3、AllowSetForegroundWindow

     HMODULE hModule = NULL;  ASFW_PTR pProcAddress = NULL;    hModule = GetModuleHandle("User32");

     if (hModule != NULL)   pProcAddress = (ASFW_PTR)GetProcAddress(hModule, "AllowSetForegroundWindow");

     if (pProcAddress != NULL)  {   nResult = (*pProcAddress)(-1);

      if (nResult == FALSE )    MessageBox(NULL, "Could not set foreground permission", NULL, MB_OK | MB_ICONERROR);  } 获得焦点: void CBillValidatorDlg::SetActive(HWND m_hWnd) {  DWORD dwForeID;    DWORD dwCurID;    HWND hForeWnd = ::GetForegroundWindow();    dwCurID = ::GetCurrentThreadId();    dwForeID = ::GetWindowThreadProcessId( hForeWnd, NULL );    ::AttachThreadInput( dwCurID, dwForeID, TRUE); //获取输入焦点  ::SetWindowPos( m_hWnd, HWND_TOPMOST, 0,0,0,0, SWP_NOSIZE|SWP_NOMOVE ); //设置Z-Order  ::SetWindowPos( m_hWnd, HWND_NOTOPMOST, 0,0,0,0, SWP_NOSIZE|SWP_NOMOVE ); //还原Z-Order  ::SetForegroundWindow( m_hWnd );   ::AttachThreadInput( dwCurID, dwForeID, FALSE); }

    1、不同线程的处理方法

    如何在2K/xp下使窗口获取焦点 在2K/XP下我们可以用 AttachThreadInput 和SetForegroundWindow来有效的获取焦点。

    //捕捉并设置当前焦点窗口为我们的窗口 AttachThreadInput( GetWindowThreadProcessId( ::GetForegroundWindow(),NULL), GetCurrentThreadId(),TRUE); //置我们的为焦点窗口 SetForegroundWindow(); SetFocus(); //释放thread AttachThreadInput( GetWindowThreadProcessId( ::GetForegroundWindow(),NULL), GetCurrentThreadId(),FALSE);

    2、同线程下的窗口无焦点弹出的方法

    在windows的窗口系统中,popup窗口的焦点是与它的活动状态密切相关的。只要使     popup窗口不获得活动状态,popup窗口就不会自动获得焦点。具体方法如下:     1.   在创建popup窗口时不要有WS_VISIBLE风格,然后调用SetWindowPos函数显示     创建的窗口,参数uFlag取值SWP_SHOWWINDOW     and     SWP_NOACTIVATE,这样就可以保证     窗口在创建是不会得到活动状态,也就不会获得焦点。     2.   响应WM_MOUSEACTIVATE消息,返回MA_NOACTIVATE表示窗口在鼠标点击时不需要     获得活动状态,这样就可以保证在鼠标点击时窗口不会自动获得焦点。     至于鼠标输入的响应,本就与窗口是否获得焦点无关,不会受到影响。

    参考:

    MSDN

    SetForegroundWindow的正确用法

  • 相关阅读:
    FJUT3565 最大公约数之和(容斥)题解
    FJUT3568 中二病也要敲代码(线段树维护区间连续最值)题解
    BZOJ 2252 矩阵距离
    BZOJ 1047 理想的正方形
    BZOJ 1486 最小圈
    BZOJ 2083 Intelligence test
    BZOJ 1045 糖果传递
    BZOJ 3450 Easy
    BZOJ 4318 OSU!
    BZOJ 1954 The xor-longest Path
  • 原文地址:https://www.cnblogs.com/2018shawn/p/9362751.html
Copyright © 2011-2022 走看看