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的正确用法

  • 相关阅读:
    DataAnnotations
    使用BizTalk实现RosettaNet B2B So Easy
    biztalk rosettanet 自定义 pip code
    Debatching(Splitting) XML Message in Orchestration using DefaultPipeline
    Modifying namespace in XML document programmatically
    IIS各个版本中你需要知道的那些事儿
    关于IHttpModule的相关知识总结
    开发设计的一些思想总结
    《ASP.NET SignalR系列》第五课 在MVC中使用SignalR
    《ASP.NET SignalR系列》第四课 SignalR自托管(不用IIS)
  • 原文地址:https://www.cnblogs.com/2018shawn/p/9362751.html
Copyright © 2011-2022 走看看