在其他进程中SetWindowLong,导致界面不能显示?
我写了一个DLL,使用SetWindowsHookEx注入到了另一个进程,成功后,使用SetWindowLong替换掉了另一进程的窗口消息循环函数,我想在该窗口上创建一个子窗口,在该函数中函数如下:
LRESULT CALLBACK DesktopNewProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
switch(uMsg)
{
case WM_CREATE_WND:
if(g_hDesktopWnd == NULL)
{
g_hDesktopWnd = ::CreateWindow("BUTTON","测试测试",WS_VISIBLE|WS_CHILD,0,0,200,200,g_hParentWnd,NULL,hDll,NULL);
}
break;
}
return CallWindowProc( lpDesktopOldProc,hwnd,uMsg,wParam,lParam );
}
执行代码之后,在另一个进程的窗口上,创建了一个BUTTON,但是,一旦我在创建该BUTTON时,为该BUTTON设置钩子,该BUTTON就不能显示了:代码如下:
LRESULT CALLBACK DesktopNewProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
switch(uMsg)
{
case WM_CREATE_WND:
if(g_hDesktopWnd == NULL)
{
g_hDesktopWnd = ::CreateWindow("BUTTON","测试测试",WS_VISIBLE|WS_CHILD,0,0,200,200,g_hParentWnd,NULL,hDll,NULL);
//相对上面,仅增加了下面一句代码:
lpCoolDesktopOldProc = (WNDPROC)::SetWindowLong(g_hDesktopWnd, GWL_WNDPROC , (long)CoolDesktopWndProc);
}
break;
}
return CallWindowProc( lpDesktopOldProc,hwnd,uMsg,wParam,lParam );
}
CoolDesktopWndProc函数的原型如下:
LRESULT CALLBACK CoolDesktopWndProc( HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
if(lpCoolDesktopOldProc)
return CallWindowProc(lpCoolDesktopOldProc,hwnd,msg,wParam,lParam );
else
return DefWindowProc(hwnd,msg,wParam,lParam);
}
不知道那位大大可以帮忙看一下,谢谢!