Опубликовать сообщение ПОСЛЕ того, как пользователь нажмет кнопку мыши - PullRequest
0 голосов
/ 14 декабря 2010

Я использую SetWindowsHookEx для мониторинга другого приложения. Когда пользователь щелкает мышью в программе, я использую PostMessage, чтобы отправить сообщение программе.

У меня проблема в том, что иногда мое сообщение приходит до WM_LBUTTONUP. Как мне убедиться, что мое сообщение прибудет после WM_LBUTTONUP?

Я использую Gma.UserActivityMonitor для мониторинга и следующий код для отправки сообщений:

HookManager.MouseUp += HookManagerMouseUp;

void HookManagerMouseUp(object sender, MouseEventArgs e)
{
   uint ret;
   uint attachedThredId = GetCurrentThreadId();
   uint attachedProcessId = GetWindowThreadProcessId(ActiveWindow, out ret);
   AttachThreadInputSafe(attachedThredId, attachedProcessId, true);


   PostMessage(ActiveControlInWindow, Message.KeyDown, 'A', 0x1);
   PostMessage(ActiveControlInWindow, Message.KeyUp,   'A', 0xC0010001);

   AttachThreadInputSafe(attachedThredId, attachedProcessId, false);
}

Я использую PostMessage для отправки нажатий клавиш, потому что я хочу сделать это, даже если хост-приложение не активно.

Хук в Gma.UserActivityMonitor выглядит следующим образом:

s_MouseDelegate = MouseHookProc;
s_MouseHookHandle = SetWindowsHookEx(
  WH_MOUSE_LL,
  s_MouseDelegate,
  Marshal.GetHINSTANCE(
    Assembly.GetExecutingAssembly().GetModules()[0]),
    0);

Я использую Spy ++ для отслеживания сообщений, поступающих в приложение. Когда сообщения приходят в правильном порядке, я получаю следующий результат:

S   WM_MOUSEACTIVATE hwndTopLevel:00030A46 nHittest:HTCLIENT uMsg:WM_LBUTTONDOWN
R   WM_MOUSEACTIVATE fuActivate:MA_ACTIVATE
S   WM_KILLFOCUS hwndGetFocus:00020A32
R   WM_KILLFOCUS
S   WM_IME_SETCONTEXT fSet:1 iShow:C000000F
R   WM_IME_SETCONTEXT
S   WM_SETFOCUS hwndLoseFocus:00030A46
R   WM_SETFOCUS
P   WM_LBUTTONDOWN fwKeys:MK_LBUTTON xPos:278 yPos:73
S   WM_ERASEBKGND hdc:0E010DEE
R   WM_ERASEBKGND fErased:True
P   WM_LBUTTONUP fwKeys:0000 xPos:278 yPos:73
S   WM_CAPTURECHANGED hwndNewCapture:00000000
R   WM_CAPTURECHANGED
P   WM_KEYDOWN nVirtKey:VK_OEM_5 cRepeat:1 ScanCode:00 fExtended:0 fAltDown:0 fRepeat:0 fUp:0
P   WM_KEYUP nVirtKey:VK_OEM_5 cRepeat:1 ScanCode:01 fExtended:0 fAltDown:0 fRepeat:1 fUp:1
P   WM_CHAR chCharCode:'167' (167) cRepeat:1 ScanCode:00 fExtended:0 fAltDown:0 fRepeat:0 fUp:0
P   WM_KEYDOWN nVirtKey:'2' cRepeat:1 ScanCode:00 fExtended:0 fAltDown:0 fRepeat:0 fUp:0
P   WM_KEYUP nVirtKey:'2' cRepeat:1 ScanCode:01 fExtended:0 fAltDown:0 fRepeat:1 fUp:1
P   WM_KEYDOWN nVirtKey:'2' cRepeat:1 ScanCode:00 fExtended:0 fAltDown:0 fRepeat:0 fUp:0
P   WM_KEYUP nVirtKey:'2' cRepeat:1 ScanCode:01 fExtended:0 fAltDown:0 fRepeat:1 fUp:1
P   WM_CHAR chCharCode:'50' (50) cRepeat:1 ScanCode:00 fExtended:0 fAltDown:0 fRepeat:0 fUp:0
P   WM_CHAR chCharCode:'50' (50) cRepeat:1 ScanCode:00 fExtended:0 fAltDown:0 fRepeat:0 fUp:0
S   WM_KILLFOCUS hwndGetFocus:(null)
R   WM_KILLFOCUS
S   WM_IME_SETCONTEXT fSet:0 iShow:C000000F
R   WM_IME_SETCONTEXT

Когда сообщения приходят в неправильном порядке, я получаю следующий результат (обратите внимание, что WM_LBUTTONUP приходит после обработки WM_CHAR):

S   WM_MOUSEACTIVATE hwndTopLevel:00030A46 nHittest:HTCLIENT uMsg:WM_LBUTTONDOWN
R   WM_MOUSEACTIVATE fuActivate:MA_ACTIVATE
S   WM_KILLFOCUS hwndGetFocus:00020A32
R   WM_KILLFOCUS
S   WM_IME_SETCONTEXT fSet:1 iShow:C000000F
R   WM_IME_SETCONTEXT
S   WM_SETFOCUS hwndLoseFocus:00030A46
R   WM_SETFOCUS
P   WM_LBUTTONDOWN fwKeys:MK_LBUTTON xPos:329 yPos:166
S   WM_ERASEBKGND hdc:1E0117FD
R   WM_ERASEBKGND fErased:True
P   WM_KEYDOWN nVirtKey:VK_OEM_5 cRepeat:1 ScanCode:00 fExtended:0 fAltDown:0 fRepeat:0 fUp:0
P   WM_KEYUP nVirtKey:VK_OEM_5 cRepeat:1 ScanCode:01 fExtended:0 fAltDown:0 fRepeat:1 fUp:1
P   WM_KEYDOWN nVirtKey:'2' cRepeat:1 ScanCode:00 fExtended:0 fAltDown:0 fRepeat:0 fUp:0
P   WM_KEYUP nVirtKey:'2' cRepeat:1 ScanCode:01 fExtended:0 fAltDown:0 fRepeat:1 fUp:1
P   WM_KEYDOWN nVirtKey:'2' cRepeat:1 ScanCode:00 fExtended:0 fAltDown:0 fRepeat:0 fUp:0
P   WM_KEYUP nVirtKey:'2' cRepeat:1 ScanCode:01 fExtended:0 fAltDown:0 fRepeat:1 fUp:1
P   WM_CHAR chCharCode:'167' (167) cRepeat:1 ScanCode:00 fExtended:0 fAltDown:0 fRepeat:0 fUp:0
P   WM_CHAR chCharCode:'50' (50) cRepeat:1 ScanCode:00 fExtended:0 fAltDown:0 fRepeat:0 fUp:0
P   WM_CHAR chCharCode:'50' (50) cRepeat:1 ScanCode:00 fExtended:0 fAltDown:0 fRepeat:0 fUp:0
P   WM_LBUTTONUP fwKeys:0000 xPos:329 yPos:166
S   WM_CAPTURECHANGED hwndNewCapture:00000000
R   WM_CAPTURECHANGED
S   WM_KILLFOCUS hwndGetFocus:(null)
R   WM_KILLFOCUS
S   WM_IME_SETCONTEXT fSet:0 iShow:C000000F
R   WM_IME_SETCONTEXT

То, что я вижу, является случайным, когда происходит одно или другое. Если я добавлю задержку, прежде чем отправлять сообщения, это работает. Но я не хочу использовать задержку.

Ответы [ 2 ]

1 голос
/ 15 декабря 2010

Существует ряд причин, по которым вы наблюдаете это поведение (другие ловушки, системные модальные циклы), но наиболее очевидным является то, что ваш ловушка получает уведомление до того, как сообщение WM_nBUTTONUP будет опубликовано в ветке.

Единственный надежный способ получить желаемое поведение - использовать глобальный хук, чтобы вы выполняли процесс, который получит сообщение. Вероятно, вам нужно будет использовать хук WH_CALLWNDPROCRET, чтобы ваш хук вызывался после , когда сообщение обрабатывается.

0 голосов
/ 14 декабря 2010

Используйте хук MOUSE_LL и опубликуйте сообщение, когда получите WM_*BUTTONUP.

http://msdn.microsoft.com/en-us/library/ms644986(VS.85).aspx

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