MFC中keybd_event的第一个参数可以是我自己定义的对话框中的某个按钮么

MFC中keybd_event的第一个参数可以是我自己定义的对话框中的某个按钮么,第1张

不可以, Keybd_event的第一个参数是键盘的虚拟键,而不是按钮的值,不过你可以给按钮指定快捷键后,来模拟就可以了,下面是Keybd_event函数的说明。

Windows提供了一个模拟键盘API函数Keybd_event(),使用该函数可以相应的屏蔽键盘的动作。Keybd_event()函数能触发一个按键事件,也就是说会产生一个WM_KEYDOWN或WM_KEYUP消息。

该函数原型如下:

  VOID keybd_event(

  BYTE bVk, // virtual-key code

  BYTE bScan, // hardware scan code

  DWORD dwFlags, // flags specifying various function options

  DWORD dwExtraInfo // additional data associated with keystroke

  );

  从原型可以看出,Keybd_event()共有四个参数:

第一个为按键的虚拟键值,如回车键为vk_return, tab键为vk_tab(其他具体的参见附录:常用模拟键的键值对照表);

第二个参数为扫描码,一般不用设置,用0代替就行;

第三个参数为选项标志,如果为keydown则置0即可,如果为keyup则设成"KEYEVENTF_KEYUP";

第四个参数一般也是置0即可。

例子1:模拟按下'A'键

   keybd_event(65,0,0,0);

   keybd_event(65,0,KEYEVENTF_KEYUP,0);

例子2:模拟按下'ALT+F4'键

   keybd_event(18,0,0,0);

   keybd_event(115,0,0,0);

   keybd_event(115,0,KEYEVENTF_KEYUP,0);

   keybd_event(18,0,KEYEVENTF_KEYUP,0);

你是说,模拟打印当前窗口内容吗?

把当前窗口内容送入剪切板,可以调用:

void snapwin_2_clipboard()

{

keybd_event(VK_LMENU,0xA4,0,0);

keybd_event(VK_SNAPSHOT,0x2C,0,0);

keybd_event(VK_SNAPSHOT,0x2C,KEYEVENTF_KEYUP,0);

keybd_event(VK_LMENU,0xA4,KEYEVENTF_KEYUP,0);

}

把当前全屏幕内容送入剪切板,可以调用:

void snapscreen_2_clipboard()

{

keybd_event(VK_SNAPSHOT,0x2C,0,0);

keybd_event(VK_SNAPSHOT,0x2C,KEYEVENTF_KEYUP,0);

}

你可以用 mspaint 之类的软件,把剪切板里的东西打印出来,或存放为图形文件。也可以自己写程序存放和打印。

头文件:

#include <Windowsh>

#include <Winuserh>

库:

#pragma comment (lib, "User32lib")

#pragma comment (lib, "Gdi32lib")

可以用WinApi实现,需要包含windowsh。

需要两个模块,一个是检测回车键的模块,一个是模拟输入指令的模块。

检测回车键,有两个函数可以用: GetKeyState和GetAsyncKeyState,两个函数的参数都是虚拟键码,虚拟键码可以在网站上查询:虚拟键码 | Microsoft Learn

两个函数的返回值相同:返回一个short型的数,short型是16位有符号的数据类型,如果要查询的键被按下,返回值最高位被置1,则这个数表示负数,所以可以用<0或>0来判断。

两个函数的区别在于,GetKeyState返回的不是键盘真实状态,而是程序获得的键盘消息。简单地说,如果程序没有获得焦点,则无法获得按键信息,返回的是没有按键的状态。而GetAsyncKeyState返回的是按键的真实状态。

 将GetAsyncKeyState放入循环,每次循环检测有没有按下回车键,如果按下则模拟输入指令;每次循环后Sleep一段时间,节约系统资源。

模拟输入指令同样有两种方法:向指定窗口发送按键信息sendMessage和模拟按键

由于我测试的软件无法用第一个方法,我只介绍第二个方法。

模拟按键就像真实按键一样,只有目标窗口获得焦点时,按键信息才会被目标窗口接收到。因此,一方面,程序不能获得焦点,只能用GetAsyncKeyState函数;另一方面,我们需要让目标窗口获得焦点。

让目标窗口获得焦点。最简单的方法是手动 *** 作,点击一下。当然也可以用FindWindow函数,或者由程序启动目标程序并获得句柄,然后调用winapi使其获得焦点。由于需求是按回车键开始模拟按键,手动 *** 作即可,这里不多赘述。

模拟按键一般使用函数Keybd_event。函数有4个参数,一般情况下,第2、4个参数置0即可,第1个参数是按键的虚拟键码,第3个参数是按键状态,0是按下,KEYEVENTF_KEYUP是抬起。注意按下和抬起之间建议Sleep几毫秒,否则目标窗口可能无法获取到按键信息。

模拟鼠标点击一般使用mouse_event,一般与SetCursorPos(x,y)函数一起使用。与Keybd_event类似,mouse_event有5个参数。第1个为dwFlags,如下图。第2、3个参数分别表示鼠标的相对位置,一般置0。第4个参数是dwData,滚轮移动数量,正值向前,负值向后。第5个参数一般置0。

使用方法与Keybd_event函数相似。用SetCursorPos(x,y)函数将鼠标光标移到指定位置(距离屏幕左边x,距离屏幕上边y),用mouse_event模拟鼠标点击。也可以先用mouse_event鼠标按下后,再用SetCursorPos(x,y)模拟鼠标拖动。最好中间也Sleep几毫秒。

GetKeyState_

GetAsyncKeyState_

void main()

{

keybd_event(112,0,0,0);// 按下按键

keybd_event(112,0,KEYEVENTF_KEYUP,0);// 这句是释放按键

}

两句加在一起才是一次完整的按键过程

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/11669529.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-17
下一篇 2023-05-17

发表评论

登录后才能评论

评论列表(0条)

保存