2009-05-04 15 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_CLOSE 또는 대신 wParam=SC_CLOSEWM_SYSCOMMAND 중 하나를 보냅니다.

WM_CLOSEWM_SYSCOMMAND/SC_CLOSE 창이 닫히도록 요청합니다. WM_DESTROY은 창을 닫았 음을 알립니다. 창문에 "당신은 닫혔다"고 말하면 닫히지 않습니다.

+0

그러나 이것은 마우스 포인터가 프로그램의 메시지 상자의 닫기 버튼 위에있을 때 명령 프롬프트 만 닫습니다. – Neal

+0

왜 WM_DESTROY가 작동하지 않았습니까 – Neal

+0

@Neal : 확장 된 대답을 참조하십시오. 그리고 네, 닫기 버튼을 마우스를 움직이는 창을 닫습니다. 이것은 당신이 요구 한 것입니다. 전체 응용 프로그램을 닫으려면 많은 작업을해야합니다. 예를 들어, 닫기 버튼이없는 "변경 사항 저장, 예/아니오"대화 상자가 응용 프로그램에서 팝업되면 어떻게됩니까? – RichieHindle