Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.07.12;
Скачать: CL | DM;

Вниз

Эмуляция служебных клавиш   Найти похожие ветки 

 
AV_Kit   (2009-05-19 21:17) [0]

Вот этот код эмулирует нажатие клавиш в любом, даже не активном окне, однако 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-19 21:30) [1]

А че, типа

PostMessage(Wnd, WM_CHAR, VKey, 0) уже некошерно писать ?
Исправить возможно, посылать не WM_CHAR, а WM_KEYDOWN+WM_KEYUP


 
KilkennyCat ©   (2009-05-19 21:52) [2]

Как поразительно устроен человеческий мозг! Знать ассемблер, и при этом не знать элементарной работы с клавиатурой! Поразительно...


 
AV_Kit   (2009-05-19 22:11) [3]

Спасибо большое, что нашли время ответить, но в Вашем варианте, ровно как и в моем, проходят к примеру:
vk_tab, vk_return, vk_escape
и не проходят
vk_end, vk_home, vk_delete


 
AV_Kit   (2009-05-19 22:22) [4]


> Как поразительно устроен человеческий мозг! Знать ассемблер,
>  и при этом не знать элементарной работы с клавиатурой!
> Поразительно...

Ассемблер я тоже не знаю, этот пример мне не единожды попадался в литературе, и это последнее что я пробовал после PostMessage() и SendMessage(), результат примерно тот-же.


 
Игорь Шевченко ©   (2009-05-19 22:37) [5]


> но в Вашем варианте, ровно как и в моем, проходят к примеру:
>
> vk_tab, vk_return, vk_escape
> и не проходят
> vk_end, vk_home, vk_delete


А как ты проверяешь ?


 
Игорь Шевченко ©   (2009-05-19 22:41) [6]

Например, в этом примере:

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, то видно, то каретка находится в конце текста


 
AV_Kit   (2009-05-19 23:14) [7]

Спасибо!
PostMessage(Edit1.Handle, WM_KEYDOWN, VK_DELETE, 0);
PostMessage(Edit1.Handle, WM_KEYUP, VK_DELETE, 0);
вроде работает.

А проверяю так, со своей программой открываю пустой блокнот, определяю Hndle и посылаю текст и коды клавиш на него.


 
Игорь Шевченко ©   (2009-05-19 23:20) [8]

Вообще есть полезная функция SendInput


 
Германн ©   (2009-05-20 00:28) [9]


> Ассемблер я тоже не знаю, этот пример мне не единожды попадался
> в литературе, и это последнее что я пробовал после PostMessage()
> и SendMessage(), результат примерно тот-же.
>


> Спасибо!
> PostMessage(Edit1.Handle, WM_KEYDOWN, VK_DELETE, 0);
> PostMessage(Edit1.Handle, WM_KEYUP, VK_DELETE, 0);
> вроде работает.

No comments!
:)



Страницы: 1 вся ветка

Текущий архив: 2009.07.12;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.013 c
2-1242710159
Sw
2009-05-19 09:15
2009.07.12
Правое выравнивание текста в компоненте Combobox


2-1242982981
dort12
2009-05-22 13:03
2009.07.12
Проблема с прекреплением attachment


15-1242300710
Jeer
2009-05-14 15:31
2009.07.12
Помощь


15-1242315887
Dimka Maslov
2009-05-14 19:44
2009.07.12
Программа выполнила недопустимую операцию и будет закрыта.


15-1242293947
TUser
2009-05-14 13:39
2009.07.12
25 мая - благотворительный концерт