Запуск скриптов из Делфи
|
xXxSh@dowxXx
|
Дата: Среда, 14.03.2012, 22:06 | Сообщение # 1
|
Авторитетный
Зарегистрирован: 22.01.2012
Группа: Модераторы
Сообщений: 702
Статус: Offline
|
Всем привет, возник такой вопрос, как заставить работать "AutoHotkey Script" из своей программы..,дело в том что у меня уже есть скрипт, который через определенный промежуток времени нажимает кнопку UP (стрелка вверх), запускается скрипт в два захода, сначала активируется на "Insert" для того что бы его можно было отключать, потом включается на "End"..., так вот я уже 3й день пытаюсь решить задачу по его запуску из своей программы, пробовал разные эмуляции нажатия клавиш в делфи, что бы активировать скрипт, но ни один пример не работает, я так понял что сам "AutoHotkey Script" перехватывает нажатия клавиш на каком то другом уровне, хз как так...
вот методы которые я использовал в своей программе на делфи:
Code
procedure EmulateKey(Wnd: HWND; VKey: Integer);
asm
push 0
push edx
push 0101H //WM_KEYUP
push eax
push 0
push edx
push 0100H //WM_KEYDOWN
push eax
call PostMessage
call PostMessage
end;
// Пример использования:
EmulateKey(Edit1.Handle, VK_END);
так же пробывал вот этот пример:
Code
keybd_event(VK_END, 0, 0, 0);
keybd_event(VK_END, 0, KEYEVENTF_KEYUP, 0);
и еще пару примеров такого же плана, но "AutoHotkey Script" не хочет запускаться ни в какую, быть может кто знает как решить эту проблему? 
вот сам скрипт:
Сообщение отредактировал xXxSh@dowxXx - Среда, 14.03.2012, 22:10
|
|
|
|
|
Волк-1024
|
Дата: Четверг, 15.03.2012, 01:38 | Сообщение # 2
|
Авторитетный
Зарегистрирован: 24.07.2011
Группа: Модераторы
Сообщений: 467
Статус: Offline
|
Процедура
procedure EmulateKey не правильно сделана. Так нельзя класть в стек параметры для функции. Сомневаюсь вообще работа ли способная она.
P.S Не могу проверить т.к уже ночь и пишу со смарта.
Про остальное не знаю.
Pascal, C\C++, Assembler, Python
|
|
|
|
|
xXxSh@dowxXx
|
Дата: Четверг, 15.03.2012, 12:11 | Сообщение # 3
|
Авторитетный
Зарегистрирован: 22.01.2012
Группа: Модераторы
Сообщений: 702
Статус: Offline
|
Quote (Волк-1024)
procedure EmulateKey не правильно сделана. Так нельзя класть в стек параметры для функции.
к моему удивлению она вполне рабочая!
|
|
|
|
|
xXxSh@dowxXx
|
Дата: Четверг, 15.03.2012, 13:49 | Сообщение # 4
|
Авторитетный
Зарегистрирован: 22.01.2012
Группа: Модераторы
Сообщений: 702
Статус: Offline
|
погуглил я немного и вот что откопал:
Многие игровые и не только программы опрашивают игровой контроллер и контроллер клавиатуры сами, не используя ОС и ее драйверы (также несложно, например, для работы с мышью не использовать функции операционной системы, а только функции BIOS). Таким программам нет никакого дела до VK_UP!
Надо искать документацию на контроллер из которой будет понятно, как этим контроллером управлять.
В общих чертах, для управления контроллером надо делать что-то типа
Код :
asm
in ПОРТ, КОМАНДА
out ПРОРТ, КОМАНДА
end;
Т.е. надо что-то писать в порты контроллера (или читать из них).
Например, пусть для определения нажата ли кнопка ждойстика надо читать из порта П1, если там 1, то нажата, 0 - не нажата (Это только методический пример! На практике все может оказаться немного сложнее. Например, контроллер клавиатуры надо опрашивать после специального прерывания, а после опроса обязательно заприсать число 20h в порт 20h).
что же делать... 
подскажите какой программой можно определить каким образом AutoHotkey Script отлавливает нажатие клавиш ?
Сообщение отредактировал xXxSh@dowxXx - Четверг, 15.03.2012, 15:26
|
|
|
|
|
Волк-1024
|
Дата: Четверг, 15.03.2012, 22:47 | Сообщение # 5
|
Авторитетный
Зарегистрирован: 24.07.2011
Группа: Модераторы
Сообщений: 467
Статус: Offline
|
Ммм. Даже хз что подсказать...
Pascal, C\C++, Assembler, Python
|
|
|
|
|
xXxSh@dowxXx
|
Дата: Пятница, 16.03.2012, 17:15 | Сообщение # 6
|
Авторитетный
Зарегистрирован: 22.01.2012
Группа: Модераторы
Сообщений: 702
Статус: Offline
|
Неужели нельзя ничего сделать, ни за что в это не поверю, как то же передаются клавиши в другие не менее дотошные программы...  |
|
|
|
|
True_Hacker
|
Дата: Воскресенье, 03.08.2014, 21:05 | Сообщение # 7
|
Новичок
Зарегистрирован: 03.08.2014
Группа: Пользователи
Сообщений: 3
Статус: Offline
|
Не совсем понял цель,ну если нужно отловить клавишу то создаешь таймер,ставишь где-то 500 или чуть меньше милесекунд а потом просто используешь GetKeyState(key)
Код
procedure TForm1.Timer1Timer(Sender: TObject);
var
KeyState: Word;
begin
KeyState:=GetKeyState(70); // Код клавиши
if KeyState and $8000 <> 0 then
begin
// Твои действия
end;
Добавлено (03.08.2014, 21:05)
---------------------------------------------
А эмулировать клавиши лучше через PostMessage т.к обращается прямо к программе а не ищет куда бы влепить этот текст/клавишу
Код
PostMessage(хэндл-окна, WM_KEYDOWN, VK_ESCAPE, 0); // Нажимаем эскейп
PostMessage(хэндл-окна, WM_KEYUP, VK_ESCAPE, 0); // Отпускаем эскейп
|
|
|
|
|