Посылка кода клавиши или текста в окно
Code: |
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. |
Новые статьи
- Как сделать клавишу-акселератор (keyboard shortcut) компонету, у которого нет заголовка
- Как определить нажаты ли клавиши Shift, Alt или Ctrl
- Как выполнять другую команду по нажатию на кнопку, если зажата клавиша Shift
- Какая клавиша нажата при загрузке приложения
- Работа с цифровой клавиатурой при выключенном NumLock
Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.
ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!