![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
ввод в чужом окне без 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!