基本上我把mousestruct放在了钩子(Hook)上

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未处于 Activity 状态,则会将其激活。
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不​​会读取应该表示新窗口已悬停的消息(或者带有钩子(Hook)的dll没有发送它,我不知道)

另外,如果该窗口与另一个窗口重叠,并且它们都是有效的窗口,则应将它们悬停激活,因为自动运行不断尝试激活当前窗口和重叠的窗口,所以我会闪烁

这里是否有我可能错过或做错的事情?

最佳答案

您可以根据周围的实现方式使用阻塞SendMessagePostMessage将发送到窗口消息队列,但可能不具有您期望的优先级,因为它在返回时不等待消息的处理。

还可以检查SetCaptureReleaseCapture来更改哪个窗口基于鼠标移动中的命中测试来捕获鼠标事件,以作为转发的替代方法。一次仅一个窗口可以使用这些功能捕获鼠标事件,从而解决您的窗口闪烁的问题,即最有可能相互转发消息。

关于c++ - 通过鼠标钩激活鼠标下的窗口,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6713747/

10-11 22:31
查看更多