微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么WM_ACTIVATEAPP不是第一次来?

我目睹了我不明白的行为:

我从桌面(这很重要,不是从VS)启动我的游戏应用程序的编译二进制文件

在加载之前,我点击另一个窗口(记事本,Skype等)

几秒钟后,应用程序被加载,窗口出现(通过CreateWindow),但不成为活动(这是好的)

我点击我的应用程序窗口

而消息WM_ACTIVATEAPP不来! WM_ACTIVATE。 虽然它应该,因为我的应用程序变得活跃(我可以看到这从标题栏颜色变化,因为GetForegroundWnd开始返回我的wnd)。 WM_NCACTIVATE然后点击msg来。 之后,如果我再次点击另一个窗口,并点击回来,WM_ACTIVATEAPP / WM_ACTIVE开始如我所料。 那里发生了什么?

最小工作示例:

#include <Windows.h> static HWND hWnd = 0; static bool bExit = false; static bool bActive = false; void SetActive( bool active ) { bActive = active; } void PumpMessages() { MSG msg; while ( PeekMessage( &msg,PM_norEMOVE ) ) { if ( ::GetMessage( &msg,0 ) ) { TranslateMessage( &msg ); dispatchMessage( &msg ); } else { bExit = true; } } } static LRESULT CALLBACK WndProc( HWND hWnd,UINT uMsg,WParaM wParam,LParaM lParam ) { switch ( uMsg ) { case WM_ACTIVATEAPP: { printf( "WM_ACTIVATEAPP,wParam = %d,lParam = %dn",wParam,lParam ); SetActive( wParam != 0 ); } break; case WM_ACTIVATE: { printf( "WM_ACTIVATE,lParam ); if ( !(HIWORD(wParam)) ) // if window is not minimized { switch ( LOWORD(wParam) ) { case WA_CLICKACTIVE: // activate window case WA_ACTIVE: { SetActive( true ); break; } case WA_INACTIVE: // deactivate window { SetActive( false ); break; } } } } break; case WM_NCACTIVATE: printf( "WM_NCACTIVATE,wParam = %dn",wParam ); break; default: break; } return DefWindowProc( hWnd,uMsg,lParam ); } int main( int argc,char* argv[] ) { HINSTANCE hInstance = GetModuleHandle( NULL ); const char *pszWnd = "WndMyMy"; const char *pszApp = "AppMyMy"; int posX = 50,posY = 50; DWORD dwWidth = 800,dwHeight = 600; Sleep(2000); WNDCLASS wndClass = { CS_DBLCLKS,WndProc,hInstance,pszWnd }; ATOM atomWndClassName = RegisterClass( &wndClass ); if ( !atomWndClassName ) return 0; DWORD dwWinStyle = WS_OVERLAPPED|WS_VISIBLE|WS_CAPTION|WS_SYSMENU|WS_THICKFRAME|WS_MINIMIZEBox|WS_MAXIMIZEBox; hWnd = CreateWindow( pszWnd,pszApp,dwWinStyle,posX,posY,dwWidth,dwHeight,0L,0L ); if ( !hWnd ) return 0; // show & update window ShowWindow( hWnd,SW_SHOW ); SetForegroundWindow( hWnd ); UpdateWindow( hWnd ); while ( !bExit ) { PumpMessages(); } return 0; }

谢谢!

用Cygwin安装pzmq

“你的小猫等待什么”来自哪里?

下载QT静态生成窗口

pipe理无客户区域

在窗户上安装Heroku toolbelt的工头无法find

操作系统Windows 8,

VS 2010 SP1。

在Windows中设置Heroku

Heroku toolbelt将不会运行在Windows 7用户与非拉丁字符在其中

如何停止IFileDialogparsing到他们的目标的快捷方式?

在win32编程中,我如何CreateWindowEx不出现在任务栏和alt + tab列表中?

使用closuresbuttonclosuresOpencv窗口

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐