基本上我在 hook 中创建了 mousestruct
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 不会读取应该指示新窗口悬停的消息(或者带钩子(Hook)的 dll 没有发送它,我不知道)
此外,如果窗口与另一个窗口重叠,并且它们都是有效窗口,应该在悬停后激活,我会闪烁,因为 autoit 不断尝试在循环中激活当前窗口和重叠的窗口
有没有我可能错过或可能做错的地方?
最佳答案
最简单的方法就是使用 Windows 内置的工具。例如在 Windows 7 上它看起来像这样:
此功能也存在于旧版本的 Windows 中,但没有在如此简单的界面中公开。相反,您必须使用 PowerToy 或通过 SystemParametersInfo
进行设置。 .
作为Raymond Chen explains ,这是用户偏好,未经用户同意不得更改。
关于c++ - 通过鼠标钩子(Hook)激活鼠标下的窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6713747/