![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Эмитация нажатия клавиши на клавиатуре
Norny © (2005-01-13 18:09:00)Не подскажете чайнику?
alpet (2005-01-20 11:58:00) [1]Под XP лучше всего напрямую использовать SendInput. Замечу что все равно не удается иммитировать такие сочетания как Win+R, а также управлять DOS приложениями.
Piter (2005-01-19 18:37:00) [2]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'а наоборот.
novill (2005-01-19 11:15:00) [3]Или можно 0 ставить?
novill (2005-01-19 11:12:00) [4]Подскажите 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
);
Piter (2005-01-17 19:44:00) [5]MR. Exx (16.01.05 22:47) [16]
Работает только на активном окне
а нажатие клавиш на клавиатуре разве не в активном окне работает? :)
Vaitek (2005-01-17 19:39:00) [6]Короче, я торомоз. Сорри за глупый вопрос.
MR. Exx (2005-01-16 22:47:00) [7]Работает только на активном окне:
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-16 21:32:00) [8]Только что проверил, keybd_event() - работает. А как туда в качестве параметра пердать например Alt-1 ?
Eraser (2005-01-16 18:09:00) [9]Kerk ©
В 1 томе, глава про ловушки.
VMcL ©
Смотрю декларацию keybd_event() и mouse_event() и не вижу никаких дескрипторов окон. Итак ещё раз: зачем в таком случае усложнять себе жизнь ловушкой? :o)
Ловушка передаёт сообщение о нажатии клавиши в очередь сообщений определённого окна.
Kerk (2005-01-15 17:46:00) [10]Piter © (15.01.05 17:44) [12]
хендл все равно знать придется
Piter (2005-01-15 17:44:00) [11]Вероятно, имелась в виду эмуляция нажатия клавиши в определенном приложении. То есть, даже если приложение не активно, например
VMcL (2005-01-15 09:52:00) [12]>> Eraser © (15.01.05 02:54) [9]
> Основная причина в том, что вы можете не знать дескриптор окна, которому хотите отправить сообщение, или же дескриптор этого окна может переодически изменяться.......
Смотрю декларацию keybd_event() и mouse_event() и не вижу никаких дескрипторов окон. Итак ещё раз: зачем в таком случае усложнять себе жизнь ловушкой? :o)
Kerk (2005-01-15 07:14:00) [13]Eraser © (15.01.05 2:54) [9]
ты дай код.. или укажи название главы, где это.
Eraser (2005-01-15 02:54:00) [14]Piter ©
Kerk ©
Специально достал книгу и проверил!!!
"Существует несколько причин, по которым ловушку следует считать лучшим способом иммитации клавишь в приложении. Вы можете спросить:""А почему бы просто не отправить сообщение wm_keyDown и wm_KeyUp?" Основная причина в том, что вы можете не знать дескриптор окна, которому хотите отправить сообщение, или же дескриптор этого окна может переодически изменяться......."
Надоело перепечатывать книгу ;)))
Короче используется ловушка JournalPlayBack. Сначала создаётся список сообщении, а потом передаётся этой ловушке. Точно ринципа работы не помню- забыл, года 2 назад когда был интерес разобрался, а сейчас лень опять в довольно объёмном коде разбираться.
Короче кому интересно- поищите в сети, эта книга есть по-моему и в эл. виде.
Авторы: Стив Тейксейра и Ксавье Пачеко.
Вариант (2005-01-14 22:06:00) [15]А SendKeys не подходит?
http://delphibase.endimus.ru/?action=viewfunc&topic=sysiface&id=10242
Если тебе нужно эмулировать нажатия клавиши, то это самое то!
Kerk (2005-01-14 04:43:00) [16]Eraser © (13.01.05 21:10) [4]
что книга авторитетная согласен. но уверен, ты путаешь. иначе - код в студию. думаю, всем будет интересно.
Piter (2005-01-13 23:27:00) [17]Eraser © (13.01.05 21:10) [4]
бред какой-то. Каким образом хуками можно имитировать нажатия клавиш?
Piter (2005-01-13 23:26:00) [18]Вопрос: как эмулировать нажатие клавиши или кнопки мыши
Ответ:
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
Eraser (2005-01-13 21:10:00) [19]Kerk ©
В смысле?
У меня в двухтомнике "Руководство разработчика" Тестейра, Пачеко (очень авторитетная книга) приведён хороший пример программы для иммитации нажатия клавишь, там всё через hook'и...
Kerk (2005-01-13 20:31:00) [20]Eraser © (13.01.05 20:23) [2]
не нужно. попробуй прочитать вопрос.