- unit Unit1;
- interface
- uses
- SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
- Forms, Dialogs, StdCtrls;
- type
- TForm1 = class(TForm)
- Button1: TButton;
- Button2: TButton;
- procedure Button1Click(Sender: TObject);
- procedure Button2Click(Sender: TObject);
- procedure FormKeyPress(Sender: TObject; var Key: Char);
- private
- AppInst: THandle;
- AppWind: THandle;
- public
- { Public declarations }
- end;
- var
- Form1: TForm1;
- implementation
- {$R *.DFM}
- uses ShellAPI;
- procedure SendShift(H: HWnd; Down: Boolean);
- var vKey, ScanCode, wParam: Word;
- lParam: longint;
- begin
- vKey:= $10;
- ScanCode:= MapVirtualKey(vKey, 0);
- wParam:= vKey or ScanCode shl 8;
- lParam:= longint(ScanCode) shl 16 or 1;
- if not(Down) then lParam:= lParam or $C0000000;
- SendMessage(H, WM_KEYDOWN, vKey, lParam);
- end;
- procedure SendCtrl(H: HWnd; Down: Boolean);
- var vKey, ScanCode, wParam: Word;
- lParam: longint;
- begin
- vKey:= $11;
- ScanCode:= MapVirtualKey(vKey, 0);
- wParam:= vKey or ScanCode shl 8;
- lParam:= longint(ScanCode) shl 16 or 1;
- if not(Down) then lParam:= lParam or $C0000000;
- SendMessage(H, WM_KEYDOWN, vKey, lParam);
- end;
- procedure SendKey(H: Hwnd; Key: char);
- var vKey, ScanCode, wParam: Word;
- lParam, ConvKey: longint;
- Shift, Ctrl: boolean;
- begin
- ConvKey:= OemKeyScan(ord(Key));
- Shift:= (ConvKey and $00020000) <> 0;
- Ctrl:= (ConvKey and $00040000) <> 0;
- ScanCode:= ConvKey and $000000FF or $FF00;
- vKey:= ord(Key);
- wParam:= vKey;
- lParam:= longint(ScanCode) shl 16 or 1;
- if Shift then SendShift(H, true);
- if Ctrl then SendCtrl(H, true);
- SendMessage(H, WM_KEYDOWN, vKey, lParam);
- SendMessage(H, WM_CHAR, vKey, lParam);
- lParam:= lParam or $C0000000;
- SendMessage(H, WM_KEYUP, vKey, lParam);
- if Shift then SendShift(H, false);
- if Ctrl then SendCtrl(H, false);
- end;
- function EnumFunc(Handle: HWnd; TF: TForm1): Bool; Far;
- begin
- TF.AppWind:= 0;
- if GetWindowWord(Handle, GWW_HINSTANCE) = TF.AppInst then
- TF.AppWind:= Handle;
- result:= (TF.AppWind = 0);
- end;
- procedure TForm1.Button1Click(Sender: TObject);
- var Text: Array[0..255] of char;
- begin
- AppInst:= ShellExecute(Handle, 'open', 'notepad.exe', nil, '', SW_NORMAL);
- EnumWindows(@EnumFunc, longint(self));
- AppWind:= GetWindow(AppWind, GW_CHILD);
- end;
- procedure TForm1.Button2Click(Sender: TObject);
- begin
- SendKey(AppWind, 'T');
- SendKey(AppWind, 'e');
- SendKey(AppWind, 's');
- SendKey(AppWind, 't');
- end;
- procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
- begin
- if AppWind <> 0 then SendKey(AppWind, Key);
- end;
- end.
- ///
- Ah,这个嘛......正好在《DELPHI新闻组学习笔记》上看到一篇:
- How to send [Alt]+[Down]?--------------发出一个Alt+Down 组合键
- Re:
- Use the keybd_event API function to fake keyboard events. Note that each
- key down event needs a matching key up or you mess up the key state array.
- keybd_event( VK_MENU, MapVirtualKey( VK_MENU, 0 ), 0 , 0 ); // Alt down
- keybd_event( VK_DOWN, MapVirtualKey( VK_DOWN, 0 ), 0 , 0 ); // down arrow key down
- keybd_event( VK_DOWN, MapVirtualKey( VK_DOWN, 0 ), KEYEVENTF_KEYUP , 0 ); // down arrow key up
- keybd_event( VK_MENU, MapVirtualKey( VK_MENU, 0 ), KEYEVENTF_KEYUP , 0 ); // Alt key up
- 经本人试验,确实可行,另加补充:
- Ctrl: VK_CONTROL
- SHIFT:VK_SHIFT
- TAB: VK_TAB
- 'A': byte('A') (98-6-8 22:28)
- /
- (*
- Converts a string of characters and key names to keyboard events and
- passes them to Windows.
- Example syntax:
- SendKeys('abc123{left}{left}{left}def{end}456{left 6}ghi{end}789', True);
- *)
- Function SendKeys(SendKeysString : PChar; Wait : Boolean) : Boolean;
- type
- WBytes = array[0..pred(SizeOf(Word))] of Byte;
- TSendKey = record
- Name : ShortString;
- VKey : Byte;
- end;