通过鼠标钩子在鼠标下激活窗口

时间:2011-07-15 22:16:51

标签: c++ winapi autoit

基本上我在钩子里做mousestruct

MOUSEHOOKSTRUCT* str;

然后从lparam,

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

然后我抓住了mousemovements

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一起发送到我的自动应用程序,该应用程序检查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

这就是我如何激活鼠标悬停的窗口,但问题是很少自动不会读取应该指示新窗口被悬停的消息(或者挂钩的dll没有发送它,我不知道)

此外,如果窗口与另一个窗口重叠,并且它们都是有效的窗口,应该在悬停时激活,我会闪烁,因为autoit不​​断尝试激活当前窗口和重叠窗口

是否有些东西可能是我错过了或者在这里做错了?

2 个答案:

答案 0 :(得分:3)

最简单的方法就是使用Windows内置的工具。例如,在Windows 7上,它看起来像这样:

enter image description here

此功能也存在于旧版本的Windows中,但不会在如此简单的界面中公开。相反,您必须使用PowerToy或SystemParametersInfo设置它。

作为Raymond Chen explains,这是用户偏好,未经用户同意不得更改。

答案 1 :(得分:1)

您可以使用阻止SendMessage,具体取决于周围的实施。 PostMessage将发送到窗口消息队列,但可能没有您期望的优先级,而不等待消息的处理。

同时检查SetCaptureReleaseCapture以更改基于鼠标移动中的点击测试捕获鼠标事件的窗口,以替代转发。一次只有一个窗口可以使用这些功能捕获鼠标事件,这样就可以解决窗口向对方发送消息的闪烁问题。