首页 > 系统相关 >C++实现windows自动化按键

C++实现windows自动化按键

时间:2024-12-20 16:20:14浏览次数:3  
标签:窗口 dwVKFkeyData windows void C++ KeyPresser 按键 DWORD

1.选择目标窗口 获取窗口句柄

void KeyPresser::selectWindow() {
    SetWinEventHook(EVENT_SYSTEM_FOREGROUND, EVENT_SYSTEM_FOREGROUND, NULL, WinEventProc, 0, 0, WINEVENT_OUTOFCONTEXT);
    selectedWindowLabel->setText("请点击目标窗口...");
}

void CALLBACK KeyPresser::WinEventProc(HWINEVENTHOOK hWinEventHook, DWORD event, HWND hwnd, LONG idObject, LONG idChild, DWORD dwEventThread, DWORD dwmsEventTime) {
    if (event == EVENT_SYSTEM_FOREGROUND) {
        wchar_t windowTitle[256];
        GetWindowText(hwnd, windowTitle, 256);
        if (KeyPresser::instance) {
            KeyPresser::instance->targetHwnd = hwnd;
            KeyPresser::instance->selectedWindowLabel->setText(QString::fromWCharArray(windowTitle));
            UnhookWinEvent(hWinEventHook);
        }
    }
}

2. 向目标窗口发送按键消息


void KeyPresser::pressKeys(int index) {
    if (targetHwnd) {
        int key = keyCombos[index]->currentData().toInt();

        DWORD dwVKFkeyData; // lParam 参数值
        WORD dwScanCode = MapVirtualKey(key, MAPVK_VK_TO_VSC); // 获取虚拟按键的键盘扫描码

        dwVKFkeyData = 1;
        dwVKFkeyData |= dwScanCode << 16;
        dwVKFkeyData |= 0 << 24;
        dwVKFkeyData |= 1 << 29;
        PostMessage(targetHwnd, WM_KEYDOWN, key, dwVKFkeyData);

        // 重置 dwVKFkeyData 以确保 WM_KEYUP 消息正确
        dwVKFkeyData = 1;
        dwVKFkeyData |= dwScanCode << 16;
        dwVKFkeyData |= 0 << 24;
        dwVKFkeyData |= 1 << 29;
        dwVKFkeyData |= 3 << 30;
        PostMessage(targetHwnd, WM_KEYUP, key, dwVKFkeyData);
    }
}

3. 成品展示

image.png

简介

  • KeyPresser 是一款免费的自动化按键工具,它可以与窗口交互,并支持后台运行, 无需保持被控窗口在前台运行。用户可以选择要操作的目标窗口,并通过勾选复选框来控制要发送哪些按键消息。可以从组合框中选择所需的按键,并在编辑框中输入时间间隔以控制按键发送之间的延迟。程序提供“开始”和“停止”按钮来启动和终止按键发送过程。

成品下载

  1. https://www.progdomain.com/627/
  2. csdn渠道下载 https://download.csdn.net/download/wang161019/89927497

完整源代码下载

https://github.com/wang161113/KeyPresser

标签:窗口,dwVKFkeyData,windows,void,C++,KeyPresser,按键,DWORD
From: https://www.cnblogs.com/Gale-Tech/p/18619511

相关文章

  • 项目实操:windows批处理拉取git库和处理目录、文件
        这个脚本从多个git库拉取源码、切换分支并适当组织目录结构。包含了常用的bat命令。    unix/linux程序员的几个注意点:目录分隔符是反斜杠,不是斜杠,错了就不行不区分大小写,文件名、目录名、命令参数都是如此windows与unix/linux相同的命令名并不多目录......
  • windows命令行与批处理
    启动win+r,输入cmd或cmd.exe,然后按回车,默认进入当前用户路径下的cmd在文件路径栏里输入cmd,可以直接跳到当前路径下的cmd命令说明不区分大小写cmd中运行可执行文件(exetxtmd等),可以不加后缀通过向上键和向下键来浏览之前运行过的命令Tab键可以自动补全(支持文件......
  • Windows Server 2019 Datacenter 激活码——亲测可用
    目前网络上流行的 WindowsServer2019KMS激活可以很方便且快速完成激活,而且不用担心安全问题。如果您是计算机运维人员,那么 WindowsServer2019想必肯定有接触不少,那么现在就来一起看看如何激活该系统吧。WindowsServer2019有三个版本,在安装的时候我们可以采用微软官......
  • NET SHARE 命令用于共享资源和管理共享,NET SHARE 命令不仅是一个基本的文件共享管理工
    这条命令的语法是:CopyCodeNETSHAREsharenamesharename=drive:path[/GRANT:user,[READ|CHANGE|FULL]][/USERS:number|/UNLIMITED][/REMARK:"text"]......
  • 07 C++
    C++1.C++中类成员的访问权限访问权限总结表访问权限当前类内部派生类内部类外部public✔️✔️✔️protected✔️✔️❌private✔️❌❌继承与访问权限基类成员权限公有继承保护继承私有继承public仍为public变为protected变为private......
  • C++学习笔记
    C++学习一、基础语法:1.整型:short:2字节,1字节占8位,可表示的数据范围是-2^15~2^15-1,第一位表示正负,所以数据范围只能是15次方int:4字节long:4字节longlong:8字节2.sizeof统计数据类型(变量)所占内存的字节大小3.浮点型:float:4字节floata=3.14fdouble:......
  • 快捷工具网(www.onlinetool7.com)提供Android KeyCode对照表,帮助开发者轻松理解按键事件
    在Android开发中,按键事件处理是应用程序中不可或缺的一部分。每个物理按键、触摸事件或软键盘输入都会生成一个独特的KeyCode,开发者需要理解这些KeyCode,才能正确处理用户的操作。快捷工具网提供AndroidKeyCode对照表,帮助开发者快速查找和理解不同按键对应的KeyCode,大大提高开......
  • Ubuntu 使用 KVM 安装 windows11 虚拟机
    1、Ubuntu安装相关组件sudoapt-getupdatesudoapt-yinstalllibvirt-devsudoapt-yinstalllibvirt-daemon-systemsudoapt-yinstalllibvirt-clientssudoapt-yinstallvirtinstsudoapt-yinstallvirt-managersudoapt-yinstallqemu-kvmsudoapt-yi......
  • windows下的命令行你常用哪些命令?
    在Windows命令行界面下,作为前端开发者,我常用以下命令:文件与目录操作:cd:用于切换目录。例如,cdC:\Users\Username\Desktop会切换到桌面目录,而cd..则会返回上一级目录。dir:列出当前目录下的文件和子目录。这个命令在查看文件夹内容时非常有用。md或mkdir:创建新目录。例......
  • c++自带的比较大小的函数和stl直接取最大最小值的函数
    在比较个数较少的数时,c++函数库自带有max()和min()函数,可以判断其中的最大最小值;代码如下:2个代码时: 多个代码时:你也可以将其赋值给一个变量还有一个STL容器的函数可以返回最大最小值的迭代器,它需要包含头文件<algorithm>执行如下:......