Delphi WinAPI SendInput - 合成击键、鼠标移动和按钮单击。
Delphi WinAPI SendInput - 合成击键、鼠标移动和按钮单击。
SendInput 函数,合成击键、鼠标移动和按钮单击。
原型:
1 2 3 4 5 | UINT SendInput( UINT cInputs, //pInputs数组中的结构数。 LPINPUT pInputs, //一组输入结构。每个结构表示要插入键盘或鼠标输入流的事件。 int cbSize //输入结构的大小,以字节为单位。如果cbSize不是输入结构的大小,则函数失败。 ); |
Delphi
1 | function SendInput(cInputs: UINT; var pInputs: TInput; cbSize: Integer ): UINT; stdcall; |
参数:
pInputs //一组输入结构。每个结构表示要插入键盘或鼠标输入流的事件。关于结构定义,请参考:
返回值(UINT):
- 函数返回成功插入键盘或鼠标输入流的事件数。如果函数返回零,则输入已经被另一个线程阻塞。要获取扩展错误信息,请调用GetLastError。
- 此函数在被UIPI阻止时失败。请注意,GetLastError和返回值都不会指示失败是由UIPI阻塞引起的。
其他事项:
- 此函数受UIPI约束。应用程序只允许将输入注入到具有相同或更低完整性级别的应用程序中。
- SendInput函数将输入结构中的事件串行插入键盘或鼠标输入流。这些事件不会与用户(使用键盘或鼠标)或通过调用keybd_event、mouse_event或其他调用SendInput插入的其他键盘或鼠标输入事件混杂在一起。
- 此功能不会重置键盘的当前状态。调用函数时已按下的任何键都可能干扰此函数生成的事件。要避免此问题,请使用GetAsyncKeyState函数检查键盘的状态,并根据需要进行更正。
- 因为触摸键盘使用winnls.h中定义的代理宏向系统发送输入,所以键盘事件挂钩上的侦听器必须解码来自触摸键盘的输入。有关详细信息,请参见代理项和补充字符。
- 可访问性应用程序可以使用SendInput注入与shell处理的应用程序启动快捷键相对应的击键。此功能不能保证适用于其他类型的应用程序。
Delphi 示例:
示例1(Win+d):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | procedure KeyPressWinD; var Inputs:TInput; begin //WIN Inputs . Itype:=INPUT_KEYBOARD; with Inputs . ki do begin wVk:=VK_LWIN; wScan:= 0 ; dwFlags:= 0 ; time:=GetTickCount; dwExtraInfo:=GetMessageExtraInfo; end ; SendInput( 1 ,Inputs,SizeOf(TInput)); //D Inputs . Itype:=INPUT_KEYBOARD; with Inputs . ki do begin wVk:= 68 ; wScan:= 0 ; dwFlags:= 0 ; time:=GetTickCount; dwExtraInfo:=GetMessageExtraInfo; end ; SendInput( 1 ,Inputs,SizeOf(TInput)); //释放 Inputs . Itype:=INPUT_KEYBOARD; with Inputs . ki do begin wVk:= 68 ; wScan:= 0 ; dwFlags:=KEYEVENTF_KEYUP; time:=GetTickCount; dwExtraInfo:=GetMessageExtraInfo; end ; SendInput( 1 ,Inputs,SizeOf(TInput)); Inputs . Itype:=INPUT_KEYBOARD; with Inputs . ki do begin wVk:=VK_LWIN; wScan:= 0 ; dwFlags:=KEYEVENTF_KEYUP; time:=GetTickCount; dwExtraInfo:=GetMessageExtraInfo; end ; SendInput( 1 ,Inputs,SizeOf(TInput)); end ; |
示例2(左键点击):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | procedure MouseClick; var Inputs : array [ 0..1 ] of TInput; begin Inputs[ 0 ].Itype:=INPUT_MOUSE; with Inputs[ 0 ].mi do begin dx:= 0 ; dy:= 0 ; mouseData:= 0 ; dwFlags:=MOUSEEVENTF_LEFTDOWN; time:=GetTickCount; dwExtraInfo:=GetMessageExtraInfo; end ; Inputs[ 1 ].Itype:=INPUT_MOUSE; with Inputs[ 1 ].mi do begin dx:= 0 ; dy:= 0 ; mouseData:= 0 ; dwFlags:=MOUSEEVENTF_LEFTUP; time:=GetTickCount; dwExtraInfo:=GetMessageExtraInfo; end ; SendInput( 2 ,Inputs[ 0 ],SizeOf(TInput)); end ; |
创建时间:2021.06.28 更新时间:
博客园 滔Roy https://www.cnblogs.com/guorongtao 希望内容对你有所帮助,谢谢!
分类:
Delphi 事件/事件类型
, WinAPI 鼠标/键盘
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
2019-06-28 [原创] delphi Memo 滚动到底部/开始 [Delphi XE、Delphi 7]