Активировать окна под мышкой через мышиный крючок - PullRequest
1 голос
/ 16 июля 2011

В основном я делаю мышиную структуру в крючке

MOUSEHOOKSTRUCT* str;

Затем делаю это из lparam,

LRESULT CALLBACK MouseProc( int nCode, WPARAM wParam, LPARAM lParam )
{
str = (MOUSEHOOKSTRUCT *) lParam;
    ...

Затем я ловлю движения мыши

case WM_MOUSEMOVE:
    wParm = AU3_WM_MOUSEMOVE;
    fromp = WindowFromPoint(str->pt);

Затем проверяю ипопытаться не отправлять много сообщений ...

if (fromp != currentwindow) 
{
    currentwindow= fromp;
    PostMessage(m_hHwndMouse, wParm,(WPARAM)( (MOUSEHOOKSTRUCT*) lParam )->hwnd, LPARAM(fromp));
}
break;

Это отправляет сообщение mousemove вместе с hwnd моему приложению autoit, которое проверяет hwnd, и, если этот hwnd не активен, оно активирует его.

Func mouse_func($hWndGUI, $MsgID, $wParam, $lParam)

Select


    Case $MsgID = $WM_AUTOITMOUSEMOVE

        If GUICtrlRead($activateundermouse) = 1 And $sitting = 0 Then
            ;Local $starttime = _Timer_Init()
            If StringInStr(WinGetTitle($lParam), "ID=") Then
                If Not WinActive($lParam) Then
                    ;ConsoleWrite("HOVERING NEW, Activate It: " & WinGetTitle($lParam) & @LF)
                    WinActivate($lParam)
                EndIf
                ;ConsoleWrite("diff is > " & _Timer_Diff($starttime) & @LF)
            EndIf
        EndIf

Вот так я активирую окно, которое наводит мышь, но проблема в том, что редко autoit не читает сообщение, которое должно сигнализировать о новом окне (или dll с hook не отправил его, я не знаю)

Также, если окно перекрывает другое окно, и оба они являются действительными окнами, которые должны быть активированы после наведения, у меня мерцает, поскольку autoit постоянно пытается активировать текущее и перекрывающееся окно в цикле

Есть что-то, что, возможно, я пропустил или мог делать неправильно здесь

Ответы [ 2 ]

3 голосов
/ 16 июля 2011

Проще всего использовать средство, встроенное в Windows.Например, в Windows 7 это выглядит так:

enter image description here

Эта возможность присутствует и в более старых версиях Windows, но не представлена ​​в таком простом интерфейсе.Вместо этого вы должны установить его с помощью PowerToy или через SystemParametersInfo.

Как Раймонд Чен объясняет , это предпочтение пользователя, которое не должно изменяться безсогласие пользователя.

1 голос
/ 16 июля 2011

Вы можете использовать блокировку SendMessage вместо этого в зависимости от окружающей реализации. PostMessage отправит в очередь сообщений окна, но может не иметь ожидаемого приоритета, поскольку он возвращается, не дожидаясь обработки сообщения.

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

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