![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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; |
| Этот пользователь сказал Спасибо angvelem за это полезное сообщение: | ||
sunday (12.05.2013)
| ||