基本上我在钩子里做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不断尝试激活当前窗口和重叠窗口
是否有些东西可能是我错过了或者在这里做错了?
答案 0 :(得分:3)
最简单的方法就是使用Windows内置的工具。例如,在Windows 7上,它看起来像这样:
此功能也存在于旧版本的Windows中,但不会在如此简单的界面中公开。相反,您必须使用PowerToy或SystemParametersInfo
设置它。
作为Raymond Chen explains,这是用户偏好,未经用户同意不得更改。
答案 1 :(得分:1)
您可以使用阻止SendMessage
,具体取决于周围的实施。 PostMessage
将发送到窗口消息队列,但可能没有您期望的优先级,而不等待消息的处理。
同时检查SetCapture
和ReleaseCapture
以更改基于鼠标移动中的点击测试捕获鼠标事件的窗口,以替代转发。一次只有一个窗口可以使用这些功能捕获鼠标事件,这样就可以解决窗口向对方发送消息的闪烁问题。