![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Собственно код отправляет эмуляцию нажатия клавиши. Код на "C" рабочий, проверял, в моей же переделки полностью бездействует.
Исходный код Код:
#include <windows.h> DWORD SendScanCode(WORD scan, BOOL up) { INPUT inp = {0}; inp.type = INPUT_KEYBOARD; inp.ki.wScan = scan; inp.ki.dwFlags = KEYEVENTF_SCANCODE | (up ? KEYEVENTF_KEYUP : 0); return SendInput(1, &inp, sizeof(inp)) ? NO_ERROR : GetLastError(); } DWORD SendVirtualKey(UINT vk, BOOL up) { UINT scan = MapVirtualKey(vk, MAPVK_VK_TO_VSC); return scan ? SendScanCode(scan, up) : ERROR_NO_UNICODE_TRANSLATION; } void main() { bool dowork = TRUE; while(dowork == TRUE) { if(GetAsyncKeyState(49)) { SendVirtualKey(VK_TAB, FALSE); SendVirtualKey(VK_TAB, TRUE); } Sleep(100); } } Код:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls; type TForm1 = class(TForm) Timer1: TTimer; procedure Timer1Timer(Sender: TObject); private { Private declarations } public { Public declarations } end; const MAPVK_VK_TO_VSC = 0; {$EXTERNALSYM MAPVK_VK_TO_VSC} MAPVK_VSC_TO_VK = 1; {$EXTERNALSYM MAPVK_VSC_TO_VK} var Form1: TForm1; TP: TPoint; implementation {$R *.dfm} function SendScanCode(scan: WORD; up: BOOL):DWORD; var inp: TINPUT; g: ShortInt; begin inp.Itype := INPUT_KEYBOARD; inp.ki.wScan := scan; if up then g := KEYEVENTF_KEYUP else g := 0; inp.ki.dwFlags := $8 or g; result := SendInput(1, inp, sizeof(inp)); end; function SendVirtualKey(vk: UINT; up: BOOL):DWORD; var scan: UINT; begin scan := MapVirtualKey(vk, MAPVK_VK_TO_VSC); result := SendScanCode(scan, up); end; procedure TForm1.Timer1Timer(Sender: TObject); begin if getasynckeystate(ord('1'))<>0 then begin SendVirtualKey(VK_TAB, FALSE); SendVirtualKey(VK_TAB, TRUE); sleep(100); end; end; end. |
#2
|
||||
|
||||
![]() Нажимаещь "1", затем кнопку. Если на форме имеются дополнительные контролы, увидишь как фосус пробегается по ним. Отпускаешь кнопку процесс прекращается.
Код:
const KEYEVENTF_SCANCODE = 8; MAPVK_VK_TO_VSC = 0; function SendScanCode(scan : WORD; up : Boolean) : DWORD; var inp : TInput; begin inp.Itype := INPUT_KEYBOARD; inp.ki.wScan := scan; inp.ki.dwFlags := KEYEVENTF_SCANCODE; if up then inp.ki.dwFlags := inp.ki.dwFlags or KEYEVENTF_KEYUP; Result := SendInput(1, inp, SizeOf(TInput)); if Result <> NO_ERROR then Result := GetLastError; end; function SendVirtualKey(vk : UINT; up : Boolean) : DWORD; var scan : UINT; begin scan := MapVirtualKey(vk, MAPVK_VK_TO_VSC); if scan > 0 then Result := SendScanCode(scan, up) else Result := ERROR_NO_UNICODE_TRANSLATION; end; procedure TForm1.Button1Click(Sender: TObject); var dowork : Boolean; begin dowork := TRUE; while dowork do begin if GetAsyncKeyState(49) <> 0 then begin SendVirtualKey(VK_TAB, False); SendVirtualKey(VK_TAB, TRUE); end else dowork := False; Sleep(100); Application.ProcessMessages; end; end; Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
Этот пользователь сказал Спасибо angvelem за это полезное сообщение: | ||
sunday (12.05.2013)
|