Как послать нажатие клавиши окно delphi

Отлавливаем нажатие калавиш клавиатуры.

Опубиковано: 08.06.2008 г., автор: , просмотров: 78467

Уроки програмирования на языке Delphi.

В этом коротком уроке я покажу вам, как перехватывать нажатия кнопок клавиатуры. Пригодиться он для написания простенького клавиатурного шпиона, который бы отлавливал нажатия клавиш и вёл лог. Можно написать просто небольшой прикол типа если пользователь нажимает клавишу «Ф» то на экране появляется «И». Короче я думаю фантазия у вас работает нормально поэтому применение этому коду вы найдете.

Начинаем кодить, нам понадобиться: Компонент Timer с закладки System и компонент Label с закладки Standart. Выделяем Timer, создаем, обработчик событий OnTime и прописываем в нем следующий код:

if getasynckeystate($1b)<>0 then
Label1.Caption:=’Вы нажали ESC’

Вот что должно получиться:

procedure TForm1.Timer1Timer(Sender: TObject);
begin
if getasynckeystate($1b)<>0 then
Label1.Caption:=’Вы нажали ESC’
end;

В данном примере мы перехватываем нажатие клавиши ESC во всем Windows и побарабану активна или нет наша программа. Используем мы здесь Api функцию getasynckeystate, в качестве параметра ей нужно указать виртуальный код клавиши, котрую хотим отлавливать. В нашем случае это Esc виртуальный код $1b. Все виртуальные коды клавиш приведены ниже:

Да чуть не забыл, свойство Interval у компонента Timer меняем на 1

vk_lbutton = $01;
vk_rbutton = $02;
vk_cancel = $03;
vk_mbutton = $04;
vk_back = $08;
vk_tab = $09;
vk_clear = $0c;
vk_return = $0d;
vk_shift = $10;
vk_control = $11;
vk_menu = $12;
vk_pause = $13;
vk_capital = $14;
vk_escape = $1b;
vk_space = $20;
vk_prior = $21;
vk_next = $22;
vk_end = $23;
vk_home = $24;
vk_left = $25;
vk_up = $26;
vk_right = $27;
vk_down = $28;
vk_select = $29;
vk_print = $2a;
vk_execute = $2b;
vk_snapshot = $2c;
vk_insert = $2d;
vk_delete = $2e;
vk_help = $2f;
>> vk_a — vk_z такие же, как и их ascii-эквиваленты: ‘a’ — ‘z’ ($41 — $5A) > vk_0 — vk_9 такие же, как и их ascii-эквиваленты: ‘0’ — ‘9’ ($30 — $39)>
vk_numpad0 = $60;
vk_numpad1 = $61;
vk_numpad2 = $62;
vk_numpad3 = $63;
vk_numpad4 = $64;
vk_numpad5 = $65;
vk_numpad6 = $66;
vk_numpad7 = $67;
vk_numpad8 = $68;
vk_numpad9 = $69;
vk_multiply = $6a;
vk_add = $6b;
vk_separator = $6c;
vk_subtract = $6d;
vk_decimal = $6e;
vk_divide = $6f;
vk_f1 = $70;
vk_f2 = $71;
vk_f3 = $72;
vk_f4 = $73;
vk_f5 = $74;
vk_f6 = $75;
vk_f7 = $76;
vk_f8 = $77;
vk_f9 = $78;
vk_f10 = $79;
vk_f11 = $7a;
vk_f12 = $7b;
vk_f13 = $7c;
vk_f14 = $7d;
vk_f15 = $7e;
vk_f16 = $7f;
vk_f17 = $80;
vk_f18 = $81;
vk_f19 = $82;
vk_f20 = $83;
vk_f21 = $84;
vk_f22 = $85;
vk_f23 = $86;
vk_f24 = $87;
vk_numlock = $90;
vk_scroll = $91;

Источник

Как послать нажатие клавиши в какое-нибудь окно?

Как послать нажатие клавиши в какое-нибудь окно?

Эта процедура посылает сообщение о нажатии клавиши.

procedure PostKeyEx32(key: Word; const shift: TShiftState; specialkey: Boolean);

type TShiftKeyInfo = record

byteset = set of 0 .. 7 ;

const shiftkeys: array [ 1 .. 3 ] of TShiftKeyInfo = ((shift: Ord(ssCtrl);

Читайте также:  Как сохранить обои при замене окон

vkey: VK_CONTROL), (shift: Ord(ssShift); vkey: VK_SHIFT), (shift: Ord(ssAlt); vkey: VK_MENU));

bShift: ByteSet absolute shift;

for i := 1 to 3 do

if shiftkeys[i].shift in bShift then

keybd_event(shiftkeys[i].vkey, MapVirtualKey(shiftkeys[i].vkey, 0 ), 0 , 0 );

if specialkey then

keybd_event(key, MapvirtualKey(key, 0 ), flag, 0 );

flag := flag or KEYEVENTF_KEYUP;

keybd_event(key, MapvirtualKey(key, 0 ), flag, 0 );

for i := 3 downto 1 do

if shiftkeys[i].shift in bShift then

keybd_event(shiftkeys[i].vkey, MapVirtualKey(shiftkeys[i].vkey, 0 ), KEYEVENTF_KEYUP, 0 );

Чтобы воспользоваться этой процедурой надо предварительно найти и активизировать нужное окно:

PS. не забудьте поставить задержки типа Sleep( 100 ) после активизации окна и между посылаемыми клавишами, не то окно может не успевать реагировать на клавиши.

Добавить комментарий

Не использовать не нормативную лексику.

Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.

ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!

Источник

Програмная эмуляция нажатия клавиш

Програмная эмуляция нажатия клавиш

Содержание материала

With keybd_event API>

procedure TForm1.Button1Click(Sender: TObject);

amount of keystrokes at the same time. >

keybd_event(VK_SHIFT, 0 , 0 , 0 );

keybd_event(Ord( ‘A’ ), 0 , 0 , 0 );

keybd_event(VK_SHIFT, 0 , KEYEVENTF_KEYUP, 0 );

keybd_event(VK_LWIN, 0 , 0 , 0 );

keybd_event(Ord( ‘R’ ), 0 , 0 , 0 );

keybd_event(VK_LWIN, 0 , KEYEVENTF_KEYUP, 0 );

procedure PostKeyExHWND(hWindow: HWnd; key: Word; const shift: TShiftState;

* hWindow: target window to be send the keystroke

* key : virtual keycode of the key to send. For printable

* keys this is simply the ANSI code (Ord(character)).

* shift : state of the modifier keys. This is a set, so you

* can set several of these keys (shift, control, alt,

* mouse buttons) in tandem. The TShiftState type is

* declared in the Classes Unit.

* specialkey: normally this should be False. Set it to True to

* specify a key on the numeric keypad, for example.

* If this parameter is true, bit 24 of the lparam for

* the posted WM_KEY* messages will be set.

* This procedure sets up Windows key state array to correctly

* reflect the requested pattern of modifier keys and then posts

* a WM_KEYDOWN/WM_KEYUP message pair to the target window. Then

* Application.ProcessMessages is called to process the messages

* before the keyboard state is restored.

* May fail due to lack of memory for the two key state buffers.

* Will raise an exception in this case.

* Setting the keyboard state will not work across applications

* running in different memory spaces on Win32 unless AttachThreadInput

* is used to connect to the target thread first.

TBuffers = array [ 0 .. 1 ] of TKeyboardState;

(* check if the target window exists *)

if IsWindow(hWindow) then

(* set local variables to default values *)

lParam := MakeLong( 0 , MapVirtualKey(key, 0 ));

(* modify lparam if special key requested *)

if specialkey then

lParam := lParam or $1000000 ;

(* allocate space for the key state buffers *)

(* Fill buffer 1 with current state so we can later restore it.

Null out buffer 0 to get a «no key pressed» state. *)

FillChar(pKeyBuffers^[ 0 ], SizeOf(TKeyboardState), 0 );

(* set the requested modifier keys to «down» state in the buffer*)

if ssShift in shift then

pKeyBuffers^[ 0 ][VK_SHIFT] := $80 ;

if ssAlt in shift then

Читайте также:  Монтаж кровельных окон велюкс

(* Alt needs special treatment since a bit in lparam needs also be set *)

pKeyBuffers^[ 0 ][VK_MENU] := $80 ;

lParam := lParam or $20000000 ;

if ssCtrl in shift then

pKeyBuffers^[ 0 ][VK_CONTROL] := $80 ;

if ssLeft in shift then

pKeyBuffers^[ 0 ][VK_LBUTTON] := $80 ;

if ssRight in shift then

pKeyBuffers^[ 0 ][VK_RBUTTON] := $80 ;

if ssMiddle in shift then

pKeyBuffers^[ 0 ][VK_MBUTTON] := $80 ;

(* make out new key state array the active key state map *)

(* post the key messages *)

if ssAlt in Shift then

PostMessage(hWindow, WM_SYSKEYDOWN, key, lParam);

PostMessage(hWindow, WM_SYSKEYUP, key, lParam or $C0000000 );

PostMessage(hWindow, WM_KEYDOWN, key, lParam);

PostMessage(hWindow, WM_KEYUP, key, lParam or $C0000000 );

(* process the messages *)

(* restore the old key state map *)

(* free the memory for the key state buffers *)

if pKeyBuffers <> nil then

procedure TForm1.Button1Click(Sender: TObject);

targetWnd := FindWindow( ‘notepad’ , nil )

if targetWnd <> 0 then

PostKeyExHWND(targetWnd, Ord( ‘I’ ), [ssAlt], False);

Источник

OnKeyDown, OnKeyUp и OnKeyPress

Симфония на клавиатуре(статья)

Содержание материала

Перевод одноимённой статьи с сайта delphi.about.com )

Начиная с самого рассвета компьютерной промышленности, клавиатура была первичным устройством ввода информации, и вероятнее всего сохранит свою позицию ещё долгое время.

События клавиатуры, наряду с событиями мыши, являются основными элементами взаимодействия пользователя с программой. В данной статье пойдёт речь о трёх событиях, которые позволяют отлавливать нажатия клавиш в приложении Delphi: OnKeyDown , OnKeyUp и OnKeyPress .

Для получения ввода с клавиатуры, приложения Delphi могут использовать два метода. Самый простой способ, это воспользоваться одним из компонентов, автоматически реагирущем на нажатия клавиш, таким как Edit. Второй способ заключается в создании процедур в форме, которые будут обрабатывать нажатия и отпускания клавиш. Эти обработчики могут обрабатывать как нажатия одиночных клавиш, так и комбинаций. Итак, вот эти события:

OnKeyDown — вызывается, когда на клавиатуре нажимается любая клавиша. OnKeyUp — вызывается, когда любая клавиша на клавиатуре отпускается. OnKeyPress — вызывается, когда нажимается клавиша, отвечающая за определённый ASCII символ.

Теперь самое время посмотреть, как выглядят в программе заголовки обработчиков:

(Sender: TObject; var Key: Word; Shift: TShiftState);

(Sender: TObject; var Key: Word; Shift: TShiftState);

(Sender: TObject; var Key: Char);

Все события имеют один общий параметр, обычно называемый Key . Этот параметр используется для передачи кода нажатой клавиши. Параметр Shift (в процедурах OnKeyDown и OnKeyUp), указывает на то, была ли нажата клавиша в сочетании с Shift , Alt , и Ctrl .

Фокус, это способность получать пользовательский ввод через мышь или клавиатуру. Получать события от клавиатуры могут только те объекты, которые имеют фокус. На форме активного приложения в один момент времени может быть активным (иметь фокус) только один компонент.

Некоторые компоненты, такие как TImage, TPaintBox, TPanel и TLabel не могут получать фокус, другими словами, это компоненты, наследованные от TGraphicControl. Так же не могут получать фокус невидимые компоненты, такие как TTimer.

События OnKeyDown и OnKeyUp обеспечивают самый низкий уровень ответа клавиатуры. Обработчики OnKeyDown и OnKeyUp могут реагировать на все клавиши клавиатуры, включая функциональные и комбинации с клавишами Shift, Alt, и Ctrl.

Читайте также:  Алюминиевый профиль для окон монтаж

События клавиатуры — не взаимоисключающие. Когда пользователь нажимает клавишу, то генерируются два события OnKeyDown и OnKeyPress, а когда отпускает, то только одно: OnKeyUp. Если пользователь нажмёт одну из клавиш, которую OnKeyPress не сможет определить, то будет сгенерировано только одно событие OnKeyDown, а при отпускании OnKeyUp.

OnKeyPress возвращает различные значения ASCII для ‘g’ и ‘G,’. Однако, OnKeyDown и OnKeyUp не делают различия между верхним и нижним регистром.

Параметры Key и Shift

Параметр Key можно изменять, чтобы приложение получило другой код нажатой клавиши. Таким образом можно ограничивать набор различных символов, которые пользователь может ввести с клавиатуры. Например разрешить вводить только цифры. Для этого добавьте в обработчик события OnKeyPress следующий код и установите KeyPreview в True (см. ниже).

if Key in [ ‘a’ .. ‘z’ ] + [ ‘A’ .. ‘Z’ ] then Key:= #0

Это выражение проверяет, содержит ли параметр Key символы нижнего регистра (‘a’..’z’) и символы верхнего регистра (‘A’..’Z’). Если так, то в параметр заносится значение нуля, чтобы предотвратить ввод в компонент Edit (например).

В Windows определены специальные константы для каждой клавиши. Например, VK_RIGHT соответствует коду клавиши для правой стрелки.

Чтобы получить состояния специальных клавиш, таких как TAB или PageUp можно воспользоваться API функцией GetKeyState . Клавиши состояния могут находиться в трёх состояниях: отпущена, нажата, и включена. Если старший бит равен 1, то клавиша нажата, иначе отпущена. Для проверки этого бита можно воспользоваться API функцией HiWord . Если младший бит равен 1, то клавиша включена. Вот пример получения сосотояния специальной клавиши:

if HiWord(GetKeyState(vk_PageUp)) <> 0 then

Источник

Как послать нажатие кнопки мыши в окно?

Как послать нажатие кнопки мыши в окно?

Содержание материала

Существуют функции winapi:

Если проверить точку нажатия мышки таким вот образом:

mouse_event(MOUSEEVENTF_MOVE, 400 , 400 , 0 , 0 );

то получилось, что мышка перемещалась не в те координаты(относительно разрешения монитора (800 на 600)) которые я задумал(в не зависимости от местоположения мышки она перемещалась строго по одному направлению на одинаковое расстояние), причем я сделал еще один вариант — dx=100, dy=100, но тогда перемещение мышки произошло в другую сторону(в сторону x=0 y=0 монитора)!

Подскажите плз в чем дело?

Автор ответа: Spawn

Mouse_event программирует не абсолюьные, а относительные координаты.

Чтобы не думалось, просто сначала установите курсор в нужную позицию — SetCursorPos(), а потом делайте клик — Mouse_event()

На форму вынесите компонент TTimer и опишите его единственное событие следующим образом:

procedure TForm1.Timer1Timer(Sender: TObject);

sendmessage(Handle, WM_LBUTTONDOWN, MK_LBUTTON, x + y shl 16 );

sendmessage(Handle, WM_LBUTTONUP, MK_LBUTTON, x + y shl 16 );

Для того, чтобы убедиться, что сообщения на самом деле посылаются, давайте обработаем событие OnMouseDown для формы. Мы попытаем обозначать те места, где якобы была нажата кнопка мыши.

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

Form1.Canvas.Ellipse(x — 2 , y — 2 , x + 2 , y + 2 );

Добавить комментарий

Не использовать не нормативную лексику.

Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.

ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!

Источник

Поделиться с друзьями