![]() |
Модераторы: bsa |
![]() ![]() ![]() |
|
Jr13san |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 174 Регистрация: 29.7.2008 Где: г. Павлово Репутация: нет Всего: нет |
Приветствую всех, кто на форуме!
При разработке приложения на c++ я заметил такую проблему на win7. На windows XP было всё в порядке. Сразу приведу небольшой код консольного приложения:
Вообщем выясняется, что в некоторых full screen-приложениях данная функция GetAsyncKeyState не реагирует при нажатии клавиш:windows(обе), Pause Break и все кнопки мышки. Сигналы от остальных клавиш обрабатываются. Что же делать с этими, для которых происходит блокировка? Из справочника прочитал, что блокировка может происходить из за: 1) Текущий рабочий стол - не активный рабочий стол. 2) Приоритетный поток принадлежит другому процессу, а рабочий стол не разрешает работу процедуры-ловушки (hook) или запись в журнал. Но я не пойму почему на winXP всё работало без проблем, а на этой win7 такая вот смешная картина? Это сообщение отредактировал(а) Jr13san - 10.5.2013, 20:02 |
|||
|
||||
Dem_max |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1780 Регистрация: 12.4.2007 Репутация: 4 Всего: 39 |
Заюзать WM_INPUT (RegisterRawInputDevices)
-------------------- Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte") |
|||
|
||||
Jr13san |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 174 Регистрация: 29.7.2008 Где: г. Павлово Репутация: нет Всего: нет |
Да, Спасибо, нашёл кое-какую информацию по этому поводу, но вот за что я не люблю этот с++, так это за кучу всяких типов.
Пишу код:
error C2664: RegisterRawInputDevices: невозможно преобразовать параметр 1 из 'RAWINPUTDEVICE' в 'PCRAWINPUTDEVICE' Я не пойму как правильно записать. Везде пишут примерно в таком формате. У меня же как всегда - ошибка. Помогите исправить пожалуйста. |
|||
|
||||
feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 12 Всего: 45 |
Добавлено через 1 минуту и 23 секунды Или -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
Jr13san |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 174 Регистрация: 29.7.2008 Где: г. Павлово Репутация: нет Всего: нет |
Хорошо, регистрацию двух девайсов мы прошли:
Что делать дальше? помогите пожалуйста дописать рабочий вариант кода, а то эти мелкософты пишут обрывками кода и у меня ничего не получается. Хоть бы сделали рабочий вариант кода - скопировал, вставил, посмотрел как работает, разобрался и подстроил их код под свои нужды. Неет им так не надо. Что-то мне подсказывает, что дальше нужно использовать функцию GetRawInputData(), а в ней опять куча параметров вот с такими типами LIAJHGQPOUAYD и KJASJHGQWsaoid. Хотя наверное все бородатые типы - это либо структуры, либо классы, заранее объявленные в каком-либо месте.. Это сообщение отредактировал(а) Jr13san - 11.5.2013, 16:18 |
|||
|
||||
Dem_max |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1780 Регистрация: 12.4.2007 Репутация: 4 Всего: 39 |
Что то с++ я вообще не увидел.
код весь тут http://msdn.microsoft.com/en-us/library/wi...6(v=vs.85).aspx http://www.codeproject.com/Articles/381673...ultiTouch-Digit P.S. обязательно указать флаг RIDEV_INPUTSINK чтобы вести отлов событий когда приложение не в фокусе. -------------------- Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte") |
||||
|
|||||
Jr13san |
|
||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 174 Регистрация: 29.7.2008 Где: г. Павлово Репутация: нет Всего: нет |
Я про него и говорил. Я хоть и не очень шарю в с++, но что-то в их исходнике я не вижу "switch" перед "case". Я вот по крайней мере даже не понимаю что конкретно проверять "кэйсом". Уж лучше бы написал кто простенький пример, хотя бы рабочий пример. Может и он работать путью не будет, что мне мучится в этих дебрях? Ладно Win API, но эти преобразования типов просто выводят из себя. Ладно.. Ещё раз прошу, помогите, напишите простенький рабочий пример, пожалуйста, ведь не долго. PS: Ладно switch-case - это ещё базовый синтаксис, а вот куда дели это ? :
Ладно, программисты, не обижайтесь, если что не так сказал... Это сообщение отредактировал(а) Jr13san - 11.5.2013, 21:48 |
||||
|
|||||
volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 16 Всего: 85 |
||||
|
||||
Jr13san |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 174 Регистрация: 29.7.2008 Где: г. Павлово Репутация: нет Всего: нет |
Да нет, вы поймите меня правильно. Я делаю консольное приложение для fullscreen-приложений: Gothic, Gothic II. Может быть даже ключевое слово и не "fullscreen", а просто у данных приложений своя обработка событий с клавиатуры и мышки. А вот, например, в том же самом CS 1.6 и "GetAsyncKeyState" нормально работает. Но у меня возникла проблема - я не знаю что писать дальше в этой структуре вызовов(т.е. в коде). Я вот и думаю, а будет ли вообще работать этот RawInputDevice? Это сообщение отредактировал(а) Jr13san - 12.5.2013, 10:41 |
|||
|
||||
volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 16 Всего: 85 |
||||
|
||||
Jr13san |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 174 Регистрация: 29.7.2008 Где: г. Павлово Репутация: нет Всего: нет |
Да хоть для программы "Калькулятор" напишите отлов событий нажатия клавиш, это не важно. Главное то, что в коде я не продвинулся дальше регистрации "девайса", который выдаёт ошибку! Что толку ходить вокруг, да около, можно тему закрывать. Всё равно путного здесь никто ничего больше не подскажет. Я сам не люблю писать или делать работу за других, но пытаюсь им объяснить так, чтобы они более-менее поняли как делать и у них всё было для этого. И в итоге люди сами всё делают. Здесь же я не вижу хода написания кода или структуры вызовов функций. У меня нету ни рабочего примера, ни понятного алгоритма действий, а только непонятные куски кода. |
|||
|
||||
volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 16 Всего: 85 |
Jr13san, чтоб что-то путное подсказали, нужно сначала задать путный вопрос. После третьего дня, кажецца я начинаю понимать что вам нужно. Вы хотите в консольном приложении отлавливать нажатия клавиш, фокус ввода которых находицца в другом приложении? так чтоле? да, и еще вопрос, от имени админа пробовали запускать вашу программу, которая на XP работала? |
|||
|
||||
Jr13san |
|
||||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 174 Регистрация: 29.7.2008 Где: г. Павлово Репутация: нет Всего: нет |
volatile, спасибо.
Ну вообщем то да. Расскажу максимально подробно как всё происходит. 1) Пользователь запускает игру - "Gothic II" и консольное приложение. 2) Консоль как только находит окно "Gothic II - 2.6 (fix)", получает его handle, PID и др., сразу же начинает искать строку с таким названием "KeyState_000" внутри памяти игры "Gothic II" через ReadProcessMemory(). И как только она находит адрес по которому расположена данная строка, она сразу же может записывать вместо нулей код текущей нажатой клавиши. Например, если нажат пробел, то строка в памяти игры "Gothic II" примет вид: "KeyState_032", дальше через 25 мсек. происходит замена кода клавиши обратно на нули: "KeyState_000". Я же со стороны игры могу обработать ту строку "KeyState_032" через скрипты и сделать определённые выводы. Вот такая система управления была задумана. Чтение и запись в память игры уже реализована. Отлов нажатий, как я уже писал раньше, был сделан на основе API функции GetAsyncKeyState(). Но на win7 для "Gothic II" она не работает как положено. Помогите мне дописать рабочий прототип на основе "RawInputDevice".
Только что попробовал - не работает. |
||||||
|
|||||||
volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 16 Всего: 85 |
Jr13san, что-то я сильно сомневаюсь что RawInputDevice будет получать клавиатурный ввод из другого приложения... Вам, имхо, нужно хук на клаву ставить. (причем в отдельной dll) SetWindowsHookEx (WH_KEYBOARD, ... SetWindowsHookEx (WH_KEYBOARD_LL, ... осилите ли, не знаю. И к тому-же в игрушках может стоять защита от этого. (впрочем это предположение, с игрушками дел не имел) |
|||
|
||||
Jr13san |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 174 Регистрация: 29.7.2008 Где: г. Павлово Репутация: нет Всего: нет |
Говорят, что из за хуков возникают сильные лаги(задержки, подвисания). Мне бы не желательно таких вещей добавлять к и так уже "старушке Gothic".
Если речь идёт об инжектинге, то я пас, и, одновременно, против данного способа. Лучше уж ничего, чем такой костыль вставлять. Ну хорошо, а может есть какие-то отдельные способы отследить нажатия только на клавиши мышки? |
|||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |