Форум: "WinAPI";
Текущий архив: 2005.03.06;
Скачать: [xml.tar.bz2];
ВнизЭмитация нажатия клавиши на клавиатуре Найти похожие ветки
← →
Norny (2005-01-13 18:09) [0]Не подскажете чайнику?
← →
Игорь Шевченко © (2005-01-13 18:14) [1]keybd_event
← →
Eraser © (2005-01-13 20:23) [2]Нужно использовать ловушки.
← →
Kerk © (2005-01-13 20:31) [3]Eraser © (13.01.05 20:23) [2]
не нужно. попробуй прочитать вопрос.
← →
Eraser © (2005-01-13 21:10) [4]Kerk ©
В смысле?
У меня в двухтомнике "Руководство разработчика" Тестейра, Пачеко (очень авторитетная книга) приведён хороший пример программы для иммитации нажатия клавишь, там всё через hook"и...
← →
Piter © (2005-01-13 23:26) [5]Вопрос: как эмулировать нажатие клавиши или кнопки мыши
Ответ:
1) Для мыши:procedure MouseClick(Pt: TPoint; BackCursor: boolean = True);
// Переводим экранные координаты к принятым в mouse_event
function ScreenToAbsolute(const Pt: TPoint): TPoint;
begin
Result.x := Round(Pt.x * 65535 / Screen.Width);
Result.y := Round(Pt.y * 65535 / Screen.Height);
end;
var
OldPt: TPoint;
begin
if BackCursor then
OldPt := ScreenToAbsolute(Mouse.CursorPos);
Pt := ScreenToAbsolute(Pt);
{Переместим курсор мыши}
Mouse_Event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_MOVE, Pt.x, Pt.y, 0, 0);
{Нажамаем левую кнопку мыши}
Mouse_Event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LEFTDOWN, Pt.x, Pt.y, 0, 0);
{Отпускаем левую кнопки мыши}
Mouse_Event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LEFTUP, Pt.x, Pt.y, 0, 0);
if BackCursor then
{Перемещаем кнопку мыши обратно}
Mouse_Event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_MOVE, OldPt.x, OldPt.y, 0, 0);
end;
Например поместим на форму две кнопки Button1 и Button2 и в их обработчиках напишем следующее:procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage("Test");
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
MouseClick(Button1.ClientToScreen(Point(2, 2)), True); // Кликаем по первой кнопке..
end;
2) Для клавиатурыprocedure PressKey(Key: byte); //Key - virtual-key code
begin
keybd_event(Key, 0, 0, 0);
keybd_event(Key, 0, KEYEVENTF_KEYUP, 0);
end;
Пример использования:procedure TForm1.Button2Click(Sender: TObject);
begin
PressKey(ord("G"));
end;
Это эквивалентно нажатию клавиши "g" на клавиатуре. Только не забудьте, что, например, в текстовом поле напечатанный символ будет зависеть от текущей раскладки ("g" при английской раскладке, "п" - при русской). Чтобы напечатать заглавную букву можно сэмулировать нажатие SHIFT, потом нажатие нужной буквы, потом отпускание SHIFT"а:keybd_event(VK_SHIFT, 0, 0, 0);
... //нажатие нужной клавиши
keybd_event(VK_SHIFT, 0, KEYEVENTF_KEYUP, 0);
И не забывайте, что CapsLock может изменить поведение SHIFT"а наоборот.
Отвечал: Jack128
← →
Piter © (2005-01-13 23:27) [6]Eraser © (13.01.05 21:10) [4]
бред какой-то. Каким образом хуками можно имитировать нажатия клавиш?
← →
Kerk © (2005-01-14 04:43) [7]Eraser © (13.01.05 21:10) [4]
что книга авторитетная согласен. но уверен, ты путаешь. иначе - код в студию. думаю, всем будет интересно.
← →
Вариант © (2005-01-14 22:06) [8]А SendKeys не подходит?
http://delphibase.endimus.ru/?action=viewfunc&topic=sysiface&id=10242
Если тебе нужно эмулировать нажатия клавиши, то это самое то!
← →
Eraser © (2005-01-15 02:54) [9]Piter ©
Kerk ©
Специально достал книгу и проверил!!!
"Существует несколько причин, по которым ловушку следует считать лучшим способом иммитации клавишь в приложении. Вы можете спросить:""А почему бы просто не отправить сообщение wm_keyDown и wm_KeyUp?" Основная причина в том, что вы можете не знать дескриптор окна, которому хотите отправить сообщение, или же дескриптор этого окна может переодически изменяться......."
Надоело перепечатывать книгу ;)))
Короче используется ловушка JournalPlayBack. Сначала создаётся список сообщении, а потом передаётся этой ловушке. Точно ринципа работы не помню- забыл, года 2 назад когда был интерес разобрался, а сейчас лень опять в довольно объёмном коде разбираться.
Короче кому интересно- поищите в сети, эта книга есть по-моему и в эл. виде.
Авторы: Стив Тейксейра и Ксавье Пачеко.
← →
Kerk © (2005-01-15 07:14) [10]Eraser © (15.01.05 2:54) [9]
ты дай код.. или укажи название главы, где это.
← →
VMcL © (2005-01-15 09:52) [11]>>Eraser © (15.01.05 02:54) [9]
>Основная причина в том, что вы можете не знать дескриптор окна, которому хотите отправить сообщение, или же дескриптор этого окна может переодически изменяться.......
Смотрю декларацию keybd_event() и mouse_event() и не вижу никаких дескрипторов окон. Итак ещё раз: зачем в таком случае усложнять себе жизнь ловушкой? :o)
← →
Piter © (2005-01-15 17:44) [12]Вероятно, имелась в виду эмуляция нажатия клавиши в определенном приложении. То есть, даже если приложение не активно, например
← →
Kerk © (2005-01-15 17:46) [13]Piter © (15.01.05 17:44) [12]
хендл все равно знать придется
← →
Eraser © (2005-01-16 18:09) [14]Kerk ©
В 1 томе, глава про ловушки.
VMcL ©
Смотрю декларацию keybd_event() и mouse_event() и не вижу никаких дескрипторов окон. Итак ещё раз: зачем в таком случае усложнять себе жизнь ловушкой? :o)
Ловушка передаёт сообщение о нажатии клавиши в очередь сообщений определённого окна.
← →
Vaitek © (2005-01-16 21:32) [15]Только что проверил, keybd_event() - работает. А как туда в качестве параметра пердать например Alt-1 ?
← →
MR. Exx (2005-01-16 22:47) [16]Работает только на активном окне:
procedure SetKey(Key:Integer);
begin
keybd_event(Key,0,KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP,0);
keybd_event(Key,0,KEYEVENTF_EXTENDEDKEY,0);
keybd_event(Key,0,KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP,0);
end;
← →
Vaitek © (2005-01-17 19:39) [17]Короче, я торомоз. Сорри за глупый вопрос.
← →
Piter © (2005-01-17 19:44) [18]MR. Exx (16.01.05 22:47) [16]
Работает только на активном окне
а нажатие клавиш на клавиатуре разве не в активном окне работает? :)
← →
novill (2005-01-19 11:12) [19]Подскажите scan code кнопки шифт (левого и правого)
нужно для исользования
VOID keybd_event(
BYTE bVk, // virtual-key code
BYTE bScan, // hardware scan code
DWORD dwFlags, // flags specifying various function options
DWORD dwExtraInfo // additional data associated with keystroke
);
← →
novill (2005-01-19 11:15) [20]Или можно 0 ставить?
← →
Piter © (2005-01-19 18:37) [21]novill (19.01.05 11:12) [19]
Подскажите scan code кнопки шифт (левого и правого)
а зачем тебе шифт? Ты кстати вообще читать умеешь?
Piter © (13.01.05 23:26) [5]
Чтобы напечатать заглавную букву можно сэмулировать нажатие SHIFT, потом нажатие нужной буквы, потом отпускание SHIFT"а:
keybd_event(VK_SHIFT, 0, 0, 0);
... //нажатие нужной клавиши
keybd_event(VK_SHIFT, 0, KEYEVENTF_KEYUP, 0);
И не забывайте, что CapsLock может изменить поведение SHIFT"а наоборот.
← →
alpet (2005-01-20 11:58) [22]Под XP лучше всего напрямую использовать SendInput. Замечу что все равно не удается иммитировать такие сочетания как Win+R, а также управлять DOS приложениями.
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2005.03.06;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.097 c