博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
模拟键盘, 含有各种方法
阅读量:5290 次
发布时间:2019-06-14

本文共 3566 字,大约阅读时间需要 11 分钟。

 

[delphi]
  1. unit Unit1;  
  2.   
  3. interface  
  4.   
  5. uses  
  6.   SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,  
  7.   Forms, Dialogs, StdCtrls;  
  8.   
  9. type  
  10.   TForm1 = class(TForm)  
  11.     Button1: TButton;  
  12.     Button2: TButton;  
  13.     procedure Button1Click(Sender: TObject);  
  14.     procedure Button2Click(Sender: TObject);  
  15.     procedure FormKeyPress(Sender: TObject; var Key: Char);  
  16.   private  
  17.     AppInst: THandle;  
  18.     AppWind: THandle;  
  19.   public  
  20.     { Public declarations }  
  21.   end;  
  22.   
  23. var  
  24.   Form1: TForm1;  
  25.   
  26. implementation  
  27.   
  28. {$R *.DFM}  
  29.   
  30. uses ShellAPI;  
  31.    
  32.   
  33. procedure SendShift(H: HWnd; Down: Boolean);  
  34. var vKey, ScanCode, wParam: Word;  
  35.     lParam: longint;  
  36. begin  
  37.   vKey:= $10;  
  38.   ScanCode:= MapVirtualKey(vKey, 0);  
  39.   wParam:= vKey or ScanCode shl 8;  
  40.   lParam:= longint(ScanCode) shl 16 or 1;  
  41.   if not(Down) then lParam:= lParam or $C0000000;  
  42.   SendMessage(H, WM_KEYDOWN, vKey, lParam);  
  43. end;  
  44.   
  45. procedure SendCtrl(H: HWnd; Down: Boolean);  
  46. var vKey, ScanCode, wParam: Word;  
  47.     lParam: longint;  
  48. begin  
  49.   vKey:= $11;  
  50.   ScanCode:= MapVirtualKey(vKey, 0);  
  51.   wParam:= vKey or ScanCode shl 8;  
  52.   lParam:= longint(ScanCode) shl 16 or 1;  
  53.   if not(Down) then lParam:= lParam or $C0000000;  
  54.   SendMessage(H, WM_KEYDOWN, vKey, lParam);  
  55. end;  
  56.   
  57. procedure SendKey(H: Hwnd; Key: char);  
  58. var vKey, ScanCode, wParam: Word;  
  59.     lParam, ConvKey: longint;  
  60.     Shift, Ctrl: boolean;  
  61. begin  
  62.   ConvKey:= OemKeyScan(ord(Key));  
  63.   Shift:= (ConvKey and $00020000) <> 0;  
  64.   Ctrl:= (ConvKey and $00040000) <> 0;  
  65.   ScanCode:= ConvKey and $000000FF or $FF00;  
  66.   vKey:= ord(Key);  
  67.   wParam:= vKey;  
  68.   lParam:= longint(ScanCode) shl 16 or 1;  
  69.   if Shift then SendShift(H, true);  
  70.   if Ctrl then SendCtrl(H, true);  
  71.   SendMessage(H, WM_KEYDOWN, vKey, lParam);  
  72.   SendMessage(H, WM_CHAR, vKey, lParam);  
  73.   lParam:= lParam or $C0000000;  
  74.   SendMessage(H, WM_KEYUP, vKey, lParam);  
  75.   if Shift then SendShift(H, false);  
  76.   if Ctrl then SendCtrl(H, false);  
  77. end;  
  78.   
  79. function EnumFunc(Handle: HWnd; TF: TForm1): Bool; Far;  
  80. begin  
  81.   TF.AppWind:= 0;  
  82.   if GetWindowWord(Handle, GWW_HINSTANCE) = TF.AppInst then  
  83.     TF.AppWind:= Handle;  
  84.   result:= (TF.AppWind = 0);  
  85. end;  
  86.   
  87. procedure TForm1.Button1Click(Sender: TObject);  
  88. var Text: Array[0..255of char;  
  89. begin  
  90.   AppInst:= ShellExecute(Handle, 'open''notepad.exe'nil'', SW_NORMAL);  
  91.   EnumWindows(@EnumFunc, longint(self));  
  92.   AppWind:= GetWindow(AppWind, GW_CHILD);  
  93. end;  
  94.   
  95.   
  96. procedure TForm1.Button2Click(Sender: TObject);  
  97. begin  
  98.   SendKey(AppWind, 'T');  
  99.   SendKey(AppWind, 'e');  
  100.   SendKey(AppWind, 's');  
  101.   SendKey(AppWind, 't');  
  102. end;  
  103.   
  104. procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);  
  105. begin  
  106.   if AppWind <> 0 then SendKey(AppWind, Key);  
  107. end;  
  108.   
  109. end.  
  110. ///   
  111. Ah,这个嘛......正好在《DELPHI新闻组学习笔记》上看到一篇:  
  112. How to send [Alt]+[Down]?--------------发出一个Alt+Down 组合键   
  113.   
  114. Re:   
  115. Use the keybd_event API function to fake keyboard events. Note that each   
  116. key down event needs a matching key up or you mess up the key state array.   
  117.   
  118.   keybd_event( VK_MENU, MapVirtualKey( VK_MENU, 0 ), 0 , 0 );     // Alt down    
  119.   keybd_event( VK_DOWN, MapVirtualKey( VK_DOWN, 0 ), 0 , 0 );     // down arrow key down    
  120.   keybd_event( VK_DOWN, MapVirtualKey( VK_DOWN, 0 ), KEYEVENTF_KEYUP , 0 );  // down arrow key up    
  121.   keybd_event( VK_MENU, MapVirtualKey( VK_MENU, 0 ), KEYEVENTF_KEYUP , 0 );  // Alt key up    
  122.   
  123. 经本人试验,确实可行,另加补充:  
  124. Ctrl: VK_CONTROL  
  125. SHIFT:VK_SHIFT  
  126. TAB:  VK_TAB  
  127. 'A':  byte('A')                (98-6-8 22:28)  
  128. /   
  129. (* 
  130. Converts a string of characters and key names to keyboard events and 
  131. passes them to Windows. 
  132.  
  133. Example syntax: 
  134.  
  135. SendKeys('abc123{left}{left}{left}def{end}456{left 6}ghi{end}789', True); 
  136.  
  137. *)  
  138.   
  139. Function SendKeys(SendKeysString : PChar; Wait : Boolean) : Boolean;  
  140. type  
  141.   WBytes = array[0..pred(SizeOf(Word))] of Byte;  
  142.   
  143.   TSendKey = record  
  144.     Name : ShortString;  
  145.     VKey : Byte;  
  146.   end;  

转载于:https://www.cnblogs.com/ywangzi/archive/2012/04/12/2444991.html

你可能感兴趣的文章
[YII2] COOKIE的操作使用
查看>>
raft学习
查看>>
JavaScript之属性操作及小例子
查看>>
《Paxos Made Simple》翻译
查看>>
URL传递中文:Server.UrlEncode与Server.UrlDecode
查看>>
apache----log_format配置
查看>>
汇编语言基础知识摘要(《汇编语言》王爽)第 2 / 17 章
查看>>
Android基于IIS的APK下载(一)自定义更新控件
查看>>
ubuntu 11.04侧边栏怎么添加图标
查看>>
DotNetBar For Windows Forms 12.5.0.2 官方原版及注册
查看>>
修改Oracle 表空间名称 tablespace name
查看>>
12枚硬币问题
查看>>
Python+Django+Ansible Playbook自动化运维项目实战(二)
查看>>
www与m站间的转换
查看>>
mxnet(gluon) 实现DQN简单小例子
查看>>
像MIUI一样做Zabbix二次开发(7)——问答
查看>>
3.6节练习
查看>>
PRML-1.2.4 高斯分布
查看>>
lua
查看>>
Logstash 基础入门
查看>>