模拟键盘, 含有各种方法

模拟键盘, 含有各种方法

 

  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;  
posted @ 2012-04-12 23:32  马儿快跑  阅读(478)  评论(0编辑  收藏  举报