c++ - 通过鼠标钩子(Hook)激活鼠标下的窗口

标签 c++ winapi autoit

基本上我在 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 上它看起来像这样:

enter image description here

此功能也存在于旧版本的 Windows 中,但没有在如此简单的界面中公开。相反,您必须使用 PowerToy 或通过 SystemParametersInfo 进行设置。 .

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

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

相关文章:

delphi - 如何在 "Browse for folder"对话框中使用自定义图标?

C++;使用 lambda 有条件地扩展类中的函数(MWE 的段错误)

c++ - 将 MPI 结果写入文件

c# - Java 铁杆专家的 Windows 开发

winapi - TextOutW 在屏幕上与打印机上的显示不同

windows - 从命令提示符执行 AutoIt 脚本

batch-file - 如何使用 7za 将文件夹添加到 7z 存档?

error-handling - 如何隐藏COM错误?

c++ - 使用 sscaf_s 从 obj 读取顶点线不起作用

c++ - Qt编程——QtConcurrence kill线程