![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Эмуляция служебных клавиш [D6, XP]
AV_Kit © (2009-05-19 21:17:00)Вот этот код эмулирует нажатие клавиш в любом, даже не активном окне, однако Home, End, Delete и т.д. не проходят. Возможно как-то исправить?
procedure EmulateKey(Wnd: HWND; VKey: Integer);
asm
push 0
push edx
push 0102H //WM_CHAR
push eax
call PostMessage
end;
Германн (2009-05-20 00:28:00) [1]
> Ассемблер я тоже не знаю, этот пример мне не единожды попадался
> в литературе, и это последнее что я пробовал после PostMessage()
> и SendMessage(), результат примерно тот-же.
>
> Спасибо!
> PostMessage(Edit1.Handle, WM_KEYDOWN, VK_DELETE, 0);
> PostMessage(Edit1.Handle, WM_KEYUP, VK_DELETE, 0);
> вроде работает.
No comments!
:)
Игорь Шевченко (2009-05-19 23:20:00) [2]Вообще есть полезная функция SendInput
AV_Kit (2009-05-19 23:14:00) [3]Спасибо!
PostMessage(Edit1.Handle, WM_KEYDOWN, VK_DELETE, 0);
PostMessage(Edit1.Handle, WM_KEYUP, VK_DELETE, 0);
вроде работает.
А проверяю так, со своей программой открываю пустой блокнот, определяю Hndle и посылаю текст и коды клавиш на него.
Игорь Шевченко (2009-05-19 22:41:00) [4]Например, в этом примере:
unit main;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Edit1: TEdit;
Button1: TButton;
procedure Button1Click(Sender: TObject);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
PostMessage(Edit1.Handle, WM_KEYDOWN, VK_DELETE, 0);
PostMessage(Edit1.Handle, WM_KEYUP, VK_DELETE, 0);
end;
end.
Видно, что нажатие клавиши Delete посылается TEdit (текст удаляется)
А если передать VK_END и установить фокус на TEdit, то видно, то каретка находится в конце текста
Игорь Шевченко (2009-05-19 22:37:00) [5]
> но в Вашем варианте, ровно как и в моем, проходят к примеру:
>
> vk_tab, vk_return, vk_escape
> и не проходят
> vk_end, vk_home, vk_delete
А как ты проверяешь ?
AV_Kit (2009-05-19 22:22:00) [6]
> Как поразительно устроен человеческий мозг! Знать ассемблер,
> и при этом не знать элементарной работы с клавиатурой!
> Поразительно...
Ассемблер я тоже не знаю, этот пример мне не единожды попадался в литературе, и это последнее что я пробовал после PostMessage() и SendMessage(), результат примерно тот-же.
AV_Kit (2009-05-19 22:11:00) [7]Спасибо большое, что нашли время ответить, но в Вашем варианте, ровно как и в моем, проходят к примеру:
vk_tab, vk_return, vk_escape
и не проходят
vk_end, vk_home, vk_delete
KilkennyCat (2009-05-19 21:52:00) [8]Как поразительно устроен человеческий мозг! Знать ассемблер, и при этом не знать элементарной работы с клавиатурой! Поразительно...
Игорь Шевченко (2009-05-19 21:30:00) [9]А че, типа
PostMessage(Wnd, WM_CHAR, VKey, 0) уже некошерно писать ?
Исправить возможно, посылать не WM_CHAR, а WM_KEYDOWN+WM_KEYUP