各位好,我利用C++开发了一个窗体程序,测试发现在Win10部分版本的系统上会回调函数会收到一些未知的窗体事件(例如,0xC09A,0xC105,0xC051,0xC4DA,0xC456等),而且部分情况下会导致我窗体无法正常显示(尤其是0xC456事件),还望有这方面了解的朋友提供参考信息。
(1)创建窗体的核心语句:
m_hHandle = CreateWindowEx(
WS_EX_LAYERED | WS_EX_APPWINDOW | WS_EX_ACCEPTFILES ,
m_wndClassEx.lpszClassName,
m_strTitleText.c_str(), // window caption
WS_POPUP | WS_VISIBLE | WS_TABSTOP | WS_MINIMIZEBOX | WS_CLIPSIBLINGS,
0,
0,
0,
0,
NULL,
NULL,
m_hInstance,
NULL);
(2)遇到的详细未知窗体事件:
message:0xC105 wparam: 0 lparam:0
message:0xC051 wparam: 1 lparam:231531616
message:0xC456 wparam: 82 lparam:1182
message:0xC456 wparam: 80 lparam:0
message:0xC456 wparam: 82 lparam:1183
message:0xC456 wparam: 80 lparam:0
message:0xC456 wparam: 82 lparam:1184
message:0xC456 wparam: 80 lparam:0
message:0xC456 wparam: 82 lparam:1185
message:0xC456 wparam: 80 lparam:0
message:0xC456 wparam: 82 lparam:1186
message:0xC456 wparam: 80 lparam:0
经过细节窗体事件的分析,发现出现问题的时候,窗体会莫名收到“WM_SIZE”(Width:2,Height:2)和“WM_MOVE”(位置为X:0,Y:0)的两个事件,感觉像是系统默认调用设置的。
我之前的逻辑是先创建窗体(X:0,Y:0,Width:0,Height:0),后续才设置窗体的大小和位置,在WinXP,Win7,绝大部分Win10系统都运行正常,所以也没有在意。之后我调整为先计算窗体大小和位置,然后在创建窗体的时候设置设置窗体的大小和位置,问题解决。
后续代码如下:
m_hHandle = CreateWindowEx(
WS_EX_LAYERED | WS_EX_APPWINDOW | WS_EX_ACCEPTFILES,
m_wndClassEx.lpszClassName,
m_strTitleText.c_str(),
WS_POPUP | WS_VISIBLE | WS_TABSTOP | WS_MINIMIZEBOX | WS_CLIPSIBLINGS,
m_pOwnerForm->GetLeft( true, true ),//0
m_pOwnerForm->GetTop( true, true ),//0
m_pOwnerForm->GetWidth(),//0
m_pOwnerForm->GetHeight(),//0
NULL,
NULL,
m_hInstance,
NULL);