我写了一个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);
}不知道那位大大可以帮忙看一下,谢谢!

解决方案 »

  1.   

    我想屏蔽掉另一个进程的某个界面,使用自己的界面!所以,准备使用钩子,在另一个进程的那个HWND上创建一个子窗口,把他覆盖,这个应该是可行的!问题是,我需要控制我创建的这个窗口的行为,限于该窗口是在另一进程创建,所以,准备在本进程使用SendMessage发送自定义消息该窗口,这样该窗口就可以实现我所要求的任意功能,但这个前提是,我能够在该窗口中截取并执行消息!使用上面的钩子,导致创建的BUTTON不能显示,但是其可以收到本进程所发送的消息并执行成功!就是不知为何BUTTON不显示了?
      

  2.   

    你需要过滤消息,如果你全部都进行消息转发就完蛋了,至少WM_PAINT不要转发,不然你的新按钮自然无法显示
      

  3.   

    目前是还没有转发任何消息~就不显示了!
    if(lpCoolDesktopOldProc) 
    return CallWindowProc(lpCoolDesktopOldProc,hwnd,msg,wParam,lParam ); 
    else 
    return DefWindowProc(hwnd,msg,wParam,lParam); 还没有转发消息,调用是系统的原来的函数!