Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Ответ
 
Опции темы
Старый 27.04.2008, 15:09   #1
Zeraim
Ra-Ra ?
Форумчанин
 
Аватар для Zeraim
 
Регистрация: 06.03.2008
Сообщений: 286
По умолчанию Имитация нажатия комбинации клавиш

Здрасте, подскажите как реализовать имитацию нажатия комбинации клавиш, задача состоит в том что надо их сначала задать а потом програма их имитирует, я на форму добавил компонент THotKey, хотелбы узнать можно его использовать в моей задаче? Если нет, то скажите какой еще способ есть.
Zeraim вне форума Ответить с цитированием
Старый 27.04.2008, 15:15   #2
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,690
По умолчанию

Эта процедура посылает сообщение о нажатии клавиши.
Код:
procedure PostKeyEx32(key: Word; const shift: TShiftState; specialkey: Boolean); 
type TShiftKeyInfo = record 
    shift: Byte; 
    vkey: Byte; 
  end; 
  byteset = set of 0..7; 
const shiftkeys: array[1..3] of TShiftKeyInfo = ((shift: Ord(ssCtrl); 
    vkey: VK_CONTROL), (shift: Ord(ssShift); vkey: VK_SHIFT), (shift: Ord(ssAlt); vkey: VK_MENU)); 

var flag: DWORD; 
  bShift: ByteSet absolute shift; 
  i: Integer; 
begin 
  for i := 1 to 3 do 
    if shiftkeys[i].shift in bShift then keybd_event(shiftkeys[i].vkey, MapVirtualKey(shiftkeys[i].vkey, 0), 0, 0); 
  if specialkey then 
    flag := KEYEVENTF_EXTENDEDKEY 
  else 
    flag := 0; 
  keybd_event(key, MapvirtualKey(key, 0), flag, 0); 
  flag := flag or KEYEVENTF_KEYUP; 
  keybd_event(key, MapvirtualKey(key, 0), flag, 0); 
  for i := 3 downto 1 do 
    if shiftkeys[i].shift in bShift then keybd_event(shiftkeys[i].vkey, MapVirtualKey(shiftkeys[i].vkey, 0), KEYEVENTF_KEYUP, 0); 
end;
Чтобы воспользоваться этой процедурой надо предварительно найти и активизировать нужное окно:

SetForegroundWindow(FindWindow(PCha r(WindowClassName), PChar(WindowCaption)));

PS. не забудьте поставить задержки типа Sleep(100) после активизации окна и между посылаемыми клавишами, не то окно может не успевать реагировать на клавиши...

Автор: Vit
www.delphist.com
www.drkb.ru
chicago.lastplanet.com


Взято с Vingrad.ru http://forum.vingrad.ru
eoln вне форума Ответить с цитированием
Старый 27.04.2008, 15:51   #3
Zeraim
Ra-Ra ?
Форумчанин
 
Аватар для Zeraim
 
Регистрация: 06.03.2008
Сообщений: 286
По умолчанию

Можете разъяснить несколько моментов?
Код:
#  if specialkey then   
#     flag := KEYEVENTF_EXTENDEDKEY
Таким способом происходит присвоение спецсимвола или что?
Код:
procedure PostKeyEx32(key: Word; const shift: TShiftState; specialkey: Boolean);
При вызове функции клавиши которые я хочу отослать записываются в key: Word; const shift: TShiftState; ?

---------------------------------------------

Что-то я неосилил этот код, несовсем еще в нем разобрался, но я попробовал просто отсылать нажате клавиши чрез
Код:
keybd_event(VK_NUMPAD8,0,0,0);
keybd_event(VK_NUMPAD8,0,KEYEVENTF_KEYUP,0);
но несрабатывает, пробовал через PostMessage и SendMessage, хендл искал через FindWindow(nil,'Holic Online') но тоже несработало, я уже незнаю что делать, может я неправильно пишу?

Последний раз редактировалось B_N; 28.04.2008 в 01:41.
Zeraim вне форума Ответить с цитированием
Старый 28.04.2008, 01:35   #4
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Листинг целиком покажите. Тот отрывок, что Вы привели, вполне рабочий.
B_N вне форума Ответить с цитированием
Старый 28.04.2008, 01:41   #5
Zeraim
Ra-Ra ?
Форумчанин
 
Аватар для Zeraim
 
Регистрация: 06.03.2008
Сообщений: 286
По умолчанию

Код:
procedure TBotForHolic.Timer1Timer(Sender: TObject);
var
 OnBuff,OnSit  : Boolean;
begin
Label2.Caption:=inttostr(getpixel(DC,555,75));
PostMessage(HWND_BROADCAST,VK_NUMPAD8,0,0);
if (GetPixel(DC,555,75) = 3285) then
begin
PostMessage(FindWindow(nil,'Holic Online'),VK_NUMPAD8,0,0);
end;
end;
Вот то что сейчас пробую, но тоже неработает, самое интересное что PostMessage(HWND_BROADCAST,VK_NUMPA D8,0,0); неработает негде, проверил на фаер фоксе в адресной строке.
Zeraim вне форума Ответить с цитированием
Старый 28.04.2008, 01:44   #6
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Цитата:
Сообщение от Zeraim Посмотреть сообщение
Вот то что сейчас пробую, но тоже неработает, самое интересное что PostMessage(HWND_BROADCAST,VK_NUMPA D8,0,0); неработает негде, проверил на фаер фоксе в адресной строке.
Это и не должно работать потому, что VK_NUMPAD8 - это не сообщение, а код клавиши. Покажите, как Вы пытались с keybd_event, ещё раз, тот отрывок, который Вы привели - рабочий.
B_N вне форума Ответить с цитированием
Старый 28.04.2008, 01:48   #7
Zeraim
Ra-Ra ?
Форумчанин
 
Аватар для Zeraim
 
Регистрация: 06.03.2008
Сообщений: 286
По умолчанию

Код:
procedure TBotForHolic.Timer1Timer(Sender: TObject);
var
 OnBuff,OnSit  : Boolean;
begin
Label2.Caption:=inttostr(getpixel(DC,555,75));
keybd_event(VK_NUMPAD8,0,0,0);
keybd_event(VK_NUMPAD8,0,KEYEVENTF_KEYUP,0);
if (GetPixel(DC,555,75) = 3285) then
begin
end;
end;
Вот только что попробовал, в фаер фоксе сработало, но в окне игры упорно не работает.
Еше я пробовал програму, которая макросы делает, хотел узнать принимаетли игра вообще програмные нажатия, так вот, макросы работают.
Zeraim вне форума Ответить с цитированием
Старый 28.04.2008, 02:03   #8
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Цитата:
Сообщение от Zeraim Посмотреть сообщение
Вот только что попробовал, в фаер фоксе сработало, но в окне игры упорно не работает.
Еше я пробовал програму, которая макросы делает, хотел узнать принимаетли игра вообще програмные нажатия, так вот, макросы работают.
Значит работает, всё-таки. А игра, видимо, просто проверяет текущее состояние клавиатуры, через GetAsyncKeyState, скажем. Вполне разумно с её стороны. Можно, конечно, поэкспериментировать с SendInput или с хуками, но может быть, что это ничего не даст и нужно будет копать гораздо глубже.
B_N вне форума Ответить с цитированием
Старый 28.04.2008, 02:05   #9
Zeraim
Ra-Ra ?
Форумчанин
 
Аватар для Zeraim
 
Регистрация: 06.03.2008
Сообщений: 286
По умолчанию

Да действительно работает, в чате в игре циферка набирается, а панель скилов не реагирует на нажатие, попробую то что вы сказали, спасибо.
----------------------------------
Если несложно ктонибудь дайте описание SendInput() на русском, английский словарный запас мой скуден, а переводчики чушь выдают.
----------------------------------
Насчет ловушек вопрос, ей надо воспользоватся чтобы заблокировать игре обработку GetAsyncKeyState или перехватить момент когда в игре определяется нажатие нужной клавиши и то что получили пересылать когда нужно? Подскажите в каком направлении мыслить.

Последний раз редактировалось rpy3uH; 28.04.2008 в 19:50.
Zeraim вне форума Ответить с цитированием
Старый 28.04.2008, 15:32   #10
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Цитата:
Сообщение от Zeraim Посмотреть сообщение
Если несложно ктонибудь дайте описание SendInput() на русском, английский словарный запас мой скуден, а переводчики чушь выдают.
----------------------------------
Насчет ловушек вопрос, ей надо воспользоватся чтобы заблокировать игре обработку GetAsyncKeyState или перехватить момент когда в игре определяется нажатие нужной клавиши и то что получили пересылать когда нужно? Подскажите в каком направлении мыслить.
Zeraim? не множьте посты, появится время - отвечу, попробуйте пока поискать по форуму, это очень частая тема, я лично показывал большой пример две недели назад, важно то, что с помощью хука можно очень легко запустить свой код в другом процессе.
B_N вне форума Ответить с цитированием
Ответ
Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Имитация нажатия клавиш Air Свободное общение 28 04.02.2010 13:38
Эмуляция нажатия нескольких клавиш -=Shad0www Общие вопросы Delphi 3 12.05.2008 08:13
Как заставить программу реагтровать на нажатия клавиш? AngelOfDeath Общие вопросы Delphi 9 07.04.2008 23:58
Проверка нажатия клавиш в компоненте Мемо|Delphi GAGARIN-NEW Помощь студентам 4 09.12.2007 20:59
программа по эмуляции нажатия клавиш sr_lexx Win Api 3 03.12.2007 16:40