2009-05-04 77 views
1

我希望任何窗口在鼠标悬停在非客户区域上的关闭按钮时关闭。我尝试在SetWindowsHookEx中使用WH_GETMESSAGE捕获wm_ncmousemove,然后使用SendMessage向指定的窗口发送WM_DESTROY消息,但窗口未关闭,然后使用 。任何帮助?在win32中挂钩

LRESULT CALLBACK CallWndProc(int code, WPARAM wParam, LPARAM lParam) 

{ 

MSG* msg = (MSG*) lParam; 
if(code == HC_ACTION) 
{ 
    if(msg->message == WM_NCMOUSEMOVE) 
    { 
     if(msg->wParam == HTCLOSE) 
     { 
      SendMessage(hwndTarget, WM_DESTROY, wParam, lParam); 
     } 
    } 
} 

return CallNextHookEx(g_hkMsg, code, wParam, lParam); 
} 

INT WINAPI InstallW(HWND hwnd, HINSTANCE hInstance, LPWSTR lpCmdLine, int nCmdShow) 
{ 

DWORD dwTarget = 0; 
POINT point; 

GetCursorPos(&point); 

hwndTarget = WindowFromPoint(point); 
dwTarget = GetWindowThreadProcessId(hwndTarget, NULL); 
g_hkMsg = SetWindowsHookEx(WH_GETMESSAGE, CallWndProc, g_hInstance, 0); 
if(g_hkMsg) 
{ 
    MessageBox(NULL, L"Message hook installed, press OK to uninstall.", L"HLHookTest", MB_ICONEXCLAMATION); 
    UnhookWindowsHookEx(g_hkMsg); 
} 
else 
    MessageBox(NULL, L"Hook installation failed.", L"HLHookTest", MB_ICONERROR); 

return 0; 
} 

回答

2

发送或者WM_CLOSEWM_SYSCOMMANDwParam=SC_CLOSE代替。

WM_CLOSEWM_SYSCOMMAND/SC_CLOSE问窗口关闭。 WM_DESTROY通知窗口它已关闭。说“你已经关闭”到窗口不会使它关闭。

+0

但是,当鼠标指针位于程序的消息框的关闭按钮上时,这只会关闭命令提示符 – Neal 2009-05-04 06:03:07