Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Работа для программиста > Фриланс
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.03.2016, 07:37   #1
stlcrash
Форумчанин
 
Регистрация: 04.07.2010
Сообщений: 132
По умолчанию Эмуляция нажатия клавиши СЛОЖНЫЙ СЛУЧАЙ

Нужно в определенный момент в игре нажать F1.
И в другой определенный момент Shift+Q.

Код:
keybd_event(VK_F1,0,0,0); 
keybd_event(VK_F1,0,KEYEVENTF_KEYUP,0);
НЕ РАБОТАЕТ

Код:
wnd:= FindWindow(nil, PChar('R2'));
SendMessage(wnd,WM_KEYDOWN,VK_F1,0);
wait(200);  //пауза,мс
SendMessage(wnd,WM_KEYUP,VK_F1,0);
Не проверял, потому что не смог получить HWND окна.

HWND под курсором над игрой выдает 0.
(на остальных окнах работает)

Пробовал даже:
Код:
    const
     exeName = 'r2client.exe';
     
    var
     fWnd:hwnd;
    
    function GetModuleFileNameExW(hProcess:THandle; hModule:HMODULE; lpFilename:PWideChar; nSize:DWORD):DWORD; stdcall; external 'PSAPI.DLL'
     
    function WindowGetEXE(wnd:HWND):string; // для Win2K/XP. В Win9x нужно юзать GetWindowModuleFileName
    var
     wt:array[0..MAX_PATH-1] of WChar;
     prc:THandle;
     prcID:cardinal;
    begin
     result:='';
     if GetWindowThreadProcessID(wnd,prcID)<>0 then
     begin
      prc:=OpenProcess(PROCESS_ALL_ACCESS,false,prcID);
      if prc<>0 then
      try
        if GetModuleFileNameExW(prc,0,wt,MAX_PATH*2)<>0 then result:=wt
      finally
       CloseHandle(prc)
      end
     end
    end;
     
    function EnumWindowsProc(wnd:HWND; lParam: LPARAM):BOOL; stdcall;
    begin
     result:=true;
     if IsWindowVisible(wnd) and (GetParent(wnd)=0) and
     (wnd<>Application.Handle) and (wnd<>Form1.Handle) // проверка, что окно не твое собственное.
     and
     (UpperCase(ExtractFileName(WindowGetEXE(wnd)))=exeName) then
     begin
       fWnd:=wnd;
       result:=false
     end
    end;
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
     fWnd:=0;
     EnumWindows(@EnumWindowsProc,0);
     if fWnd=0 then ShowMessage('Not found') else ShowMessage('Found window '+IntToStr(fWnd))
    end;
Игра видимо чем то защищена. НО МАКРОСЫ С МЫШКИ РАБОТАЮТ. но на мышке всего 2 кнопки под макросы, а надо штуки 4 - 5 на все случаи жизни как говорится. Если кто знает решение, но ему ленится помочь, я готов даже заплатить
stlcrash вне форума Ответить с цитированием
Старый 01.03.2016, 10:13   #2
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

Цитата:
Игра видимо чем то защищена. НО МАКРОСЫ С МЫШКИ РАБОТАЮТ. но на мышке всего 2 кнопки под макросы, а надо штуки 4 - 5 на все случаи жизни как говорится. Если кто знает решение, но ему ленится помочь, я готов даже заплатить
Макросы работают на аппаратном уровне, т.е. через драйвер компилируются и заливаются в прошивку мыши и работают на кнопках. Это игра никак и никогда не заблокирует.

Покупайте другую мышь. У a4tech есть более кнопочные хомяки.
Человек_Борща вне форума Ответить с цитированием
Старый 01.03.2016, 10:43   #3
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Цитата:
для Win2K/XP. В Win9x нужно юзать GetWindowModuleFileName
Археолог

Я б попробовал Autohotkey, там есть разные способы эмуляции нажатия и не надо кучу винапи кода писать.

А если проблема с мышью только в количестве, то тогда проще другую купить. Или клавиатуры тоже есть с доп. клавишами и макросами.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 03.03.2016, 11:44   #4
stlcrash
Форумчанин
 
Регистрация: 04.07.2010
Сообщений: 132
По умолчанию

Дело в том, что я играю на маге, нужны умные макросы. Например сменить кольца, дать прокаст. НО если здоровье ниже определенного уровня сразу пить бутылку итд. Реакция нужна ОЧЕНЬ хорошая, а смотреть сразу в 3 места одновременное не очень удобно. А так програмно контролируется половина и остается только позиционирование грамотное.

Пока нашел другое решение, более муторное. Защита отлавливает ЛЮБОЕ програмное нажатие, тк там какой то флаг посылается и избавиться от него вроде не возможно.

Думаю решить проблему следующим образом: с помощью схемы эмулировать HID устройство. НА него програмно слать что нужно выполнить а платка эта будет в ответ на сигнал в комп слать сигнал как будто она клавиатура ))
stlcrash вне форума Ответить с цитированием
Старый 03.03.2016, 12:04   #5
sauwork
Пользователь
 
Аватар для sauwork
 
Регистрация: 02.01.2015
Сообщений: 12
По умолчанию

Обычно игры используют DirectInput , который работает со своими драйверами и winapi функции ему по барабану , тогда нужно писать хук на соответствующие directx функции , ну или взять directx sdk , подправить , да скомпилировать свой вариант directinput-а. - кинув в папку с игрой.
Ну а ежели , все таки winapi , то там нужно проверить очередь сообщений - spy++ , зачастую игры вставляют дополнительные аргументы в команды WM_* , и это нужно учитывать.
почта: sauwork@yandex.ru , телега: @sauwork

Последний раз редактировалось sauwork; 03.03.2016 в 12:07.
sauwork вне форума Ответить с цитированием
Старый 03.03.2016, 13:47   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

для начала забудьте вы устаревшую keybd_event
попробуйте SendInput.
а иначе да, либо искать готовый драйвер, либо писать свой.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 04.03.2016, 22:52   #7
stlcrash
Форумчанин
 
Регистрация: 04.07.2010
Сообщений: 132
По умолчанию

Тему можно закрывать. Защита игры не ломается програмными методами. Только на аппаратном уровне.
stlcrash вне форума Ответить с цитированием
Старый 05.03.2016, 00:27   #8
sauwork
Пользователь
 
Аватар для sauwork
 
Регистрация: 02.01.2015
Сообщений: 12
По умолчанию

Цитата:
Сообщение от stlcrash Посмотреть сообщение
Защита игры не ломается програмными методами. Только на аппаратном уровне.
Глупости
почта: sauwork@yandex.ru , телега: @sauwork
sauwork вне форума Ответить с цитированием
Старый 06.03.2016, 05:34   #9
stlcrash
Форумчанин
 
Регистрация: 04.07.2010
Сообщений: 132
По умолчанию

Цитата:
Сообщение от sauwork Посмотреть сообщение
Глупости
К компьютеру подсоеденяется плата, выдающая себя за USB клавиатуру/мышку и одновременно открывающая COM порт. На компорт програмно отсылаю даннные. Плата их обрабатывает и в зависимости от результата отсылает в комп клики мышкой/клавиатурой.

Дургими методами ломать защиту с моими знаниями намного дольше.
stlcrash вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
эмуляция нажатия клавиши F Vitek_DeadlyHunter Общие вопросы Delphi 3 03.11.2011 12:44
Эмуляция нажатия клавиши в неактивном окне Ga-sergey Общие вопросы Delphi 6 27.05.2010 23:21
Эмуляция нажатия клавиши helenfly Win Api 9 01.12.2009 12:09
Эмуляция нажатия клавиши...... Zoidberg Win Api 4 11.01.2007 18:44