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

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

ввод в чужом окне без keybd_Event


__Ed__ ©   (2003-08-02 14:08:00) 

Уважаемае мастера! Как корректно эмулировать в чужом окне
(есть хэндл) ввод символов, не используя keybd_Event?
Я пробовал SendMessage(Handle, WM_KEYDOWN, ...) и WM_KEYUP но
реакции не было. Может что то не то с параметрами намудрил,
а может этот метод не работает?

Заранее спасибо за развёрнутый ответ! :)


oni   (2003-08-07 19:07:00) [1]

//Try this:

procedure TForm1.PostKey(hWindow: HWnd; key: Word; const shift: TShiftState; specialkey: Boolean);
var
lParam: LongInt;
begin
if IsWindow(hWindow) then
begin
lParam := MakeLong(0, MapVirtualKey(key, 0));
if specialkey then
lParam := lParam or $1000000;
if ssShift in shift then
PostMessage(hWindow, WM_KEYDOWN, VK_SHIFT, MakeLong(0, MapVirtualKey(VK_SHIFT, 0)));
if ssAlt in shift then
begin
PostMessage(hWindow, WM_SYSKEYDOWN, VK_CONTROL, MakeLong(0, MapVirtualKey(VK_CONTROL, 0)));
lParam := lParam or $20000000;
end;
if ssCtrl in shift then
PostMessage(hWindow, WM_KEYDOWN, VK_CONTROL, MakeLong(0, MapVirtualKey(VK_CONTROL, 0)));
if ssLeft in shift then
PostMessage(hWindow, WM_KEYDOWN, VK_LBUTTON, MakeLong(0, MapVirtualKey(VK_LBUTTON, 0)));
if ssRight in shift then
PostMessage(hWindow, WM_KEYDOWN, VK_RBUTTON, MakeLong(0, MapVirtualKey(VK_RBUTTON, 0)));
if ssMiddle in shift then
PostMessage(hWindow, WM_KEYDOWN, VK_MBUTTON, MakeLong(0, MapVirtualKey(VK_MBUTTON, 0)));
(* post the key messages *)
if ssAlt in Shift then
begin
PostMessage(hWindow, WM_SYSKEYDOWN, key, lParam);
PostMessage(hWindow, WM_SYSKEYUP, key, lParam or $C0000000);
end
else
begin
PostMessage(hWindow, WM_KEYDOWN, key, lParam);
PostMessage(hWindow, WM_KEYUP, key, lParam or $C0000000);
end;
Application.ProcessMessages;
if ssMiddle in shift then
PostMessage(hWindow, WM_KEYUP, VK_MBUTTON, MakeLong(0, MapVirtualKey(VK_MBUTTON, 0)));
if ssRight in shift then
PostMessage(hWindow, WM_KEYUP, VK_RBUTTON, MakeLong(0, MapVirtualKey(VK_RBUTTON, 0)));
if ssLeft in shift then
PostMessage(hWindow, WM_KEYUP, VK_LBUTTON, MakeLong(0, MapVirtualKey(VK_LBUTTON, 0)));
if ssCtrl in shift then
PostMessage(hWindow, WM_KEYUP, VK_CONTROL, MakeLong(0, MapVirtualKey(VK_CONTROL, 0)));
if ssAlt in shift then
( hWindow, WM_SYSKEYUP, VK_CONTROL, MakeLong(0, MapVirtualKey(VK_CONTROL, 0)

//Try this:

procedure TForm1.PostKey(hWindow: HWnd; key: Word; const shift: TShiftState; specialkey: Boolean);
var
lParam: LongInt;
begin
if IsWindow(hWindow) then
begin
lParam := MakeLong(0, MapVirtualKey(key, 0));
if specialkey then
lParam := lParam or $1000000;
if ssShift in shift then
PostMessage(hWindow, WM_KEYDOWN, VK_SHIFT, MakeLong(0, MapVirtualKey(VK_SHIFT, 0)));
if ssAlt in shift then
begin
PostMessage(hWindow, WM_SYSKEYDOWN, VK_CONTROL, MakeLong(0, MapVirtualKey(VK_CONTROL, 0)));
lParam := lParam or $20000000;
end;
if ssCtrl in shift then
PostMessage(hWindow, WM_KEYDOWN, VK_CONTROL, MakeLong(0, MapVirtualKey(VK_CONTROL, 0)));
if ssLeft in shift then
PostMessage(hWindow, WM_KEYDOWN, VK_LBUTTON, MakeLong(0, MapVirtualKey(VK_LBUTTON, 0)));
if ssRight in shift then
PostMessage(hWindow, WM_KEYDOWN, VK_RBUTTON, MakeLong(0, MapVirtualKey(VK_RBUTTON, 0)));
if ssMiddle in shift then
PostMessage(hWindow, WM_KEYDOWN, VK_MBUTTON, MakeLong(0, MapVirtualKey(VK_MBUTTON, 0)));
(* post the key messages *)
if ssAlt in Shift then
begin
PostMessage(hWindow, WM_SYSKEYDOWN, key, lParam);
PostMessage(hWindow, WM_SYSKEYUP, key, lParam or $C0000000);
end
else
begin
PostMessage(hWindow, WM_KEYDOWN, key, lParam);
PostMessage(hWindow, WM_KEYUP, key, lParam or $C0000000);
end;
Application.ProcessMessages;
if ssMiddle in shift then
PostMessage(hWindow, WM_KEYUP, VK_MBUTTON, MakeLong(0, MapVirtualKey(VK_MBUTTON, 0)));
if ssRight in shift then
PostMessage(hWindow, WM_KEYUP, VK_RBUTTON, MakeLong(0, MapVirtualKey(VK_RBUTTON, 0)));
if ssLeft in shift then
PostMessage(hWindow, WM_KEYUP, VK_LBUTTON, MakeLong(0, MapVirtualKey(VK_LBUTTON, 0)));
if ssCtrl in shift then
PostMessage(hWindow, WM_KEYUP, VK_CONTROL, MakeLong(0, MapVirtualKey(VK_CONTROL, 0)));
if ssAlt in shift then
PostMessage(hWindow, WM_SYSKEYUP, VK_CONTROL, MakeLong(0, MapVirtualKey(VK_CONTROL, 0)));
end; { If }
end; { PostKey }

//Example:
PostKey(HWnd, VK_RETURN, [], FALSE);
//OR:
PostKey(TELL_HWnd, ORD("7"), [], FALSE);
//OR:
PostKey(TELL_HWnd, VK_DOWN, [], TRUE);


Сергеич   (2003-08-07 11:40:00) [2]

Работал над этой пробл.
Спокойно можно посылать любые клавиши с помощью
PostMessage и\или Sendmessage, кроме vk_control, vk_shift.
Т.е. из сочетания Ctrl Home уйдет только Номе.
Текст программы могу послать.
Отлажена 90% с помощью keybd_event.
Пиши abc@aeroflot.ru


Diamond Cat   (2003-08-07 01:30:00) [3]

sendinput


esVer   (2003-08-03 17:06:00) [4]

keybd_Event однозначно надежнее.


Spawn   (2003-08-03 10:53:00) [5]

ScanCode:=MapVirtualKey(Key,0);
lParam := ScanCode shl 16 or 1;
SendMessage(Wnd,WM_KEYDOWN,Key,lParam);


Delphi5.01   (2003-08-02 21:55:00) [6]

poprobui WM_SETETXT
no u mnea taje problema, v nekotorix oknax ne pishet, a s nekotorix ne mogu poluchit soderjimoe!


Наверх

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