Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Эмуляция служебных клавиш [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


Наверх

Титульная страница Поиск, карта сайта Написать письмо