2011-03-07 72 views
0

在我的C++ MFC應用程序中,我有一個窗體上的ActiveX控件。在某個時候,我創建並顯示一個新的對話框。我不希望用戶能夠在第二個對話框啓動時單擊ActiveX控件,因此我試圖將其創建爲子對話框。但是,ActiveX控件總是以Z順序出現在子對話框上方。我試圖發送消息創建更改Z順序,但沒有任何工作。使用Windows掛鉤攔截鼠標點擊我的應用程序C++

我使用的是Windows鉤子使用下面的代碼攔截鼠標點擊嘗試:

GetWindowsHookEx(WH_MOUSE_LL, (HOOKPROC)CDWFDLG::ClickProc, GetModuleHandle(NULL), 0) 

LRESULT CALLBACK CDWFDLG::ClickProc(int ncode, WPARAM wparam, LPARAM lparam) 
{ 

if(wparam == WM_LBUTTONDOWN) 
{ 
    Beep(110, 30); 
    return TRUE; 
} 
return CallNextHookEx(0, ncode, wparam, lparam); 
} 

這將阻止所有鼠標左鍵點擊這是我想要的。然而,它在所有事情上都這樣做,而不僅僅是在我的應用程序上。我試過設置使用

GetCurrentThreadId() 

GetWindowThreadProcessId(this->m_hWnd, &threadId) 

然而這些都不工作的線程ID。我應該使用什麼來讓鉤子在我的應用程序上運行?一旦這個工作正常,我正在計劃使用點擊的座標來檢查是否在新對話框中並從那裏處理它。

感謝

+1

只需通過ShowDialog模式顯示對話框不起作用? – Thomas 2011-03-07 12:11:53

+0

@Thomas:完全同意。模態對話框應該解決這個問題。 – 0xC0000022L 2011-03-07 12:33:59

+0

我沒有將'ShowDialog'作爲對話框的方法。它絕對使用CDialog作爲基類。有'ShowWindow'和'DoModal'。 – ADringer 2011-03-07 16:26:15

回答

0

雖然我不能修復使用窗口掛鉤的問題,我想我已經使用對話框屬性固定它。我已經將父對話框的Control Parent設置爲True,並將子對話框屬性中的其他所有內容都設爲默認值(Control爲false,Style爲Popup等)。

現在,當我通過DoModal()調用對話框時,它具有焦點並且不允許點擊ActiveX控件。

感謝

1

GetWindowsHookEx(WH_MOUSE_LL,(HOOKPROC)CDWFDLG :: ClickProc,的GetModuleHandle(NULL),0)

意味着你在全球範圍掛鉤,所有的鼠標點擊執行。

你想要的是鉤住WH_MOUSE,選項GetCurrentThreadId()而不是0,這會產生你想要的結果。