Использование Windows Hooks для перехвата щелчка мышью на моем приложении c ++ - PullRequest
0 голосов
/ 07 марта 2011

В моем приложении C ++ MFC у меня есть элемент управления ActiveX на форме. В какой-то момент я создаю и показываю новый диалог. Я не хочу, чтобы пользователь мог щелкнуть элемент управления ActiveX, когда этот второй диалог включен, поэтому я попытался создать его как дочерний диалог. Однако элемент управления ActiveX всегда отображается над дочерним диалогом в Z-порядке. Я попытался отправить сообщение о создании, чтобы изменить порядок Z, но ничего не помогло.

Я пытался использовать Windows Hooks для перехвата щелчка мышью, используя следующий код:

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 )

Однако ни один из них не сработал. Что я должен использовать, чтобы просто запустить приложение в моем приложении? Как только это заработало, я планировал использовать координаты щелчка, чтобы проверить, есть ли в новом диалоге, и обработать его оттуда.

Спасибо

Ответы [ 2 ]

1 голос
/ 30 июня 2013

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

Означает, что вы перехватываете глобально, все щелчки мыши выполнены.

Вам нужно перехватить WH_MOUSE, с параметром GetCurrentThreadId () вместо 0, это приведет к желаемым результатам.

0 голосов
/ 09 марта 2011

Хотя я не мог решить проблему с помощью Window Hooks, я думаю, что я исправил ее, используя свойства диалога.Я установил для родительского диалога Control Parent значение True и оставил все остальное в свойствах дочернего диалога по умолчанию (Control - false, а Style - Popup и т. Д.).

Теперь, когда я вызываю диалог через DoModal(), он имеет фокус и не позволяет щелкать элемент управления ActiveX.

Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...