Есть ли способ перехватить события мыши для определенной кнопки в форме окна - PullRequest
3 голосов
/ 14 октября 2011

Я хочу подключить события WM_MOUSEDOWN и WM_MOUSEUP от определенной кнопки внутри определенного окна.Я думаю, что SetWindowsHookEx перехватит сообщения, которые я хочу.и FindWindowEx поможет мне найти дескриптор окна, из которого я хочу перехватить эти события.

Я просто не знаю, как заставить его выдавать мне События из определенных дескрипторов окна.Или как определить, к какому дескриптору должно относиться сообщение.

Любой, кто еще имеет опыт в этом, был бы очень признателен за хорошее1010 * В качестве альтернативы код для инструмента Spy ++ в C # или рабочая копия ManagedSpy или что-то подобное.Я хочу научиться ориентироваться в иерархии дескрипторов окон и перехватывать события окон из них.

Ответы [ 2 ]

1 голос
/ 14 октября 2011

SetWindowsHookEx может использоваться для подключения определенной нити или всех нитей.Вы не можете зацепить конкретную ручку.Вы можете получить конкретный поток или все потоки приложения Windows Form и подключить их, но это не решит вашу проблему, это всего лишь соображение производительности.

В обратном вызове MouseProc вы можетеотфильтровать события WM_LBUTTONDOWN, WM_LBUTTONUP, используя wParam.

. Вы можете получить указатель на окно, в которое происходит это событие мыши, от lParam

MOUSEHOOKSTRUCT * pMouseHookStruct = (MOUSEHOOKSTRUCT *) lParam;
HWMD hWnd = pMouseHookStruct->hwnd;

от hwnd вы можете получить все детали окна и проверить, является ли оно тем же окном форм окна.

Если вы хотите, чтобы события мыши имели только определенную кнопку, вы можете получить информацию об объекте пользовательского интерфейса изщелкнуть мышью и отфильтровать события соответственно (используя UIAutomation)

CoCreateInstance(__uuidof(CUIAutomation), NULL, CLSCTX_INPROC_SERVER, __uuidof(IUIAutomation), (void**)&pAutomation);

pAutomation->ElementFromPoint(*pPoint, &pIUIAutomationElement);

. Вы можете получить button name, rect coordinates, hot keys и т. д. из IUIAutomationElement

1 голос
/ 14 октября 2011

Вы не можете заставить SetWindowsHookEx выдавать вам только события из одного дескриптора окна, но вы можете отфильтровать его самостоятельно.Если вы используете WH_CALLWNDPROC или WH_CALLWNDPROCRET (что необходимо для получения интересующих вас сообщений мыши), значение lParam CallWndProc и CallWndRetProc являются структурой, которая содержит дескриптор окна элемента управления, обрабатывающего сообщение.

Таким образом, при обратном вызове SetWindowsHookEx вам нужно только проверить, что сообщение относится к окну, которое вы фильтруете.

Например:

static HWND s_hWndButton;
.....
SetWindowsHookEx(WH_CALLWNDPROC, ButtonHookProc, ....);
.....
LRESULT CALLBACK CallWndProc(int nCode, WPARAM wParam, LPARAM lParam) {
    if (nCode >= 0) {
        CWPSTRUCT* cp = (CWPSTRUCT*)lParam;
        if (cp->hWnd == s_hWndButton) {
            if (cp->Msg == WM_MOUSEUP || cp->Msg == WM_MOUSEDOWN) {
                // Your logic goes here
            }
        }
    }

    Return CallNextHookEx(NULL, nCode, wParam, lParam);
}

Практически та же логика применима к WH_CALLWNDPROCRET

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