最近对Windows 10进行的Creator更新破坏了我使用Win32 API GetWindowLong()的应用程序代码.
在Windows 10 Creator Update之前,一个进程(比如进程A)能够在另一个进程的窗口句柄(比如进程B)上调用GetWindowWord()/ GetWindowLong()API,即使在某些系统中阻止了进程B(主线程)调用(例如等待释放互斥锁).因此,尽管进程B被阻止,但进程A能够成功地使用这些API查询进程B拥有的窗口的保留内存.
但是,在Windows 10上应用创建者更新时,当进程B(主线程)被阻止时,进程A在属于进程B的窗口上调用这些API时会被阻止.
我通过创建2个代表进程A和进程B的独立Win32应用程序来模拟这种情况.在应用了创建者更新的Windows 10系统上,进程A在属于进程B的窗口上调用GetWindowLong()/ GetWindowWord()时挂起进程B(主线程)正在等待互斥锁.换句话说,对GetWindowLong()/ GetWindowWord()的调用从未返回,从而使进程A挂起.
但是,当我在没有Creators Update或早期版本(如Windows 7)的Windows 10系统上使用我的独立应用程序测试相同的场景时,对进程A中的GetWindowLong()/ GetWindowWord()API的调用成功返回进程B正在等待一个互斥锁被释放.
为了演示上述问题,这里是进程A和进程B的代码.要查看问题,请运行进程A和进程B.然后,找出进程B窗口的窗口句柄(例如,使用Spy ++)然后粘贴它进入进程A的窗口的编辑字段.然后单击"确定".将显示一个消息框,显示在进程B的窗口的额外内存中设置的LONG值(使用SetWindowLong()).到现在为止还挺好.现在,进入B的窗口,点击"Block"按钮使其挂起.这将使进程"B"(主GUI线程)等待永远不会被释放的互斥锁,因此进程B将挂起.
现在,返回进程A的窗口并再次单击OK(假设编辑字段仍然具有您之前粘贴的进程B的窗口句柄).
现在,这是行为上的差异:
在Windows 10上没有创建者更新和早期的Windows版本(如Windows 7),就像以前一样(即进程B没有挂起),一个消息框显示在进程B的窗口的额外内存中设置的LONG值(使用SetWindowLong())显示.
在带有Creators Update的Windows 10上,进程A挂起,因为使用进程B的窗口句柄调用SetWindowLong()永远不会返回使进程A挂起.
请建议我如何绕过Windows 10 Creators Update上的这种行为更改,以便我的应用程序不会挂起.任何想法/帮助将不胜感激.
这是进程A的代码.
/* Process A */
#include <windows.h>
#include <stdio.h>
#include <commctrl.h>
int count = 0;
int count1 = 0;
TCHAR str[1000];
LRESULT CALLBACK WindowFunc(HWND,UINT,WPARAM,LPARAM);
HWND g_hwndEdit, g_hwndButton;
#define ID_EDIT (3456)
#define ID_OK (3457)
TCHAR szWinName[] = TEXT("MyWin");
HINSTANCE g_hInst = NULL;
int WINAPI WinMain(HINSTANCE hThisInst,HINSTANCE hPrevInst,LPSTR …Run Code Online (Sandbox Code Playgroud)