Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Функция "GetAsyncKeyState" отрабатывает выборочно. 
V
    Опции темы
Jr13san
Дата 10.5.2013, 19:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 174
Регистрация: 29.7.2008
Где: г. Павлово

Репутация: нет
Всего: нет



Приветствую всех, кто на форуме!
При разработке приложения на c++ я заметил такую проблему на win7. На windows XP было всё в порядке.
Сразу приведу небольшой код консольного приложения:
Код

//Включаем заголовочные файлы в проект
#include <windows.h>//для использования Windows API функций
#include <iostream>//специально для функции printf()


void main()
{
    while(1)//реализуем бесконечный цикл
    {
        if (GetAsyncKeyState(VK_LWIN))//проверяем нажата ли Левая клавиша Windows, если да, то
        {
            printf("%s","Windows");//выводим сообщение
            Sleep(100);//делаем задержку на 100 мсек.
        }
    }
}

Вообщем выясняется, что в некоторых full screen-приложениях данная функция GetAsyncKeyState не реагирует при нажатии клавиш:windows(обе), Pause Break и все кнопки мышки. Сигналы от остальных клавиш обрабатываются. Что же делать с этими, для которых происходит блокировка?
Из справочника прочитал, что блокировка может происходить из за:
1) Текущий рабочий стол - не активный рабочий стол.
2) Приоритетный поток принадлежит другому процессу, а рабочий стол не разрешает работу процедуры-ловушки (hook) или запись в журнал.

Но я не пойму почему на winXP всё работало без проблем, а на этой win7 такая вот смешная картина?

Это сообщение отредактировал(а) Jr13san - 10.5.2013, 20:02
PM MAIL WWW ICQ   Вверх
Dem_max
Дата 11.5.2013, 05:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 4
Всего: 39



Заюзать WM_INPUT (RegisterRawInputDevices)


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
Jr13san
Дата 11.5.2013, 09:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 174
Регистрация: 29.7.2008
Где: г. Павлово

Репутация: нет
Всего: нет



Да, Спасибо, нашёл кое-какую информацию по этому поводу, но вот за что я не люблю этот с++, так это за кучу всяких типов.
Пишу код:
Код

//Включаем заголовочные файлы в проект
#include <windows.h>//для использования Windows API функций
#include <iostream>//специально для функции printf()

void main()
{
    RAWINPUTDEVICE Rid;
    Rid.usUsagePage = 1;
    Rid.usUsage = 6;
    Rid.dwFlags = 0;
    Rid.hwndTarget = NULL;

    if (RegisterRawInputDevices(Rid,1,sizeof(RAWINPUTDEVICE)) == FALSE)
    {
        printf("%s","Handle Error");
    }
}

error C2664: RegisterRawInputDevices: невозможно преобразовать параметр 1 из 'RAWINPUTDEVICE' в 'PCRAWINPUTDEVICE'

Я не пойму как правильно записать. Везде пишут примерно в таком формате. У меня же как всегда - ошибка. Помогите исправить пожалуйста.
PM MAIL WWW ICQ   Вверх
feodorv
Дата 11.5.2013, 11:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(Jr13san @  11.5.2013,  10:38 Найти цитируемый пост)
    if (RegisterRawInputDevices(&Rid,1,sizeof(RAWINPUTDEVICE)) == FALSE)


Добавлено через 1 минуту и 23 секунды
Или
Цитата(Jr13san @  11.5.2013,  10:38 Найти цитируемый пост)
    RAWINPUTDEVICE Rid[1];




--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
Jr13san
Дата 11.5.2013, 12:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 174
Регистрация: 29.7.2008
Где: г. Павлово

Репутация: нет
Всего: нет



Хорошо, регистрацию двух девайсов мы прошли:
Код

//Включаем заголовочные файлы в проект
#include <windows.h>//для использования Windows API функций
#include <iostream>//специально для функции printf()


void main()
{
    setlocale(LC_ALL, "Russian");//устанавливаем русский язык для вывода информации на экран
    HWND hWnd = NULL;//объявляем переменную hWnd(handle Window) и присваиваем ей значение NULL(т.е. пустое значение)
    while(!hWnd)//ищем хэндл окна до тех пор, пока не найдём его
    {
        hWnd = FindWindow(NULL, TEXT("Gothic II - 2.6 (fix)"));
        Sleep(100);//задержка цикла
    }

    RAWINPUTDEVICE Rid[2]; 

    Rid[0].usUsagePage = 0x01; 
    Rid[0].usUsage = 0x02; 
    Rid[0].dwFlags = RIDEV_NOLEGACY;   // adds HID mouse and also ignores legacy mouse messages
    Rid[0].hwndTarget = 0;

    Rid[1].usUsagePage = 0x01; 
    Rid[1].usUsage = 0x06; 
    Rid[1].dwFlags = RIDEV_NOLEGACY;   // adds HID keyboard and also ignores legacy keyboard messages
    Rid[1].hwndTarget = 0;

    if (RegisterRawInputDevices(Rid, 2, sizeof(Rid[0])) == FALSE)
    {
        //registration failed. Call GetLastError for the cause of the error
        printf("%s","Registration failed");
    }

}


Что делать дальше? помогите пожалуйста дописать рабочий вариант кода, а то эти мелкософты пишут обрывками кода и у меня ничего не получается. Хоть бы сделали рабочий вариант кода - скопировал, вставил, посмотрел как работает, разобрался и подстроил их код под свои нужды. Неет им так не надо.

Что-то мне подсказывает, что дальше нужно использовать функцию GetRawInputData(), а в ней опять куча параметров вот с такими типами LIAJHGQPOUAYD и KJASJHGQWsaoid. Хотя наверное все бородатые типы - это либо структуры, либо классы, заранее объявленные в каком-либо месте..

Это сообщение отредактировал(а) Jr13san - 11.5.2013, 16:18
PM MAIL WWW ICQ   Вверх
Dem_max
Дата 11.5.2013, 19:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 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")
PM MAIL   Вверх
Jr13san
Дата 11.5.2013, 20:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 174
Регистрация: 29.7.2008
Где: г. Павлово

Репутация: нет
Всего: нет




Я про него и говорил.
Я хоть и не очень шарю в с++, но что-то в их исходнике я не вижу "switch" перед "case". Я вот по крайней мере даже не понимаю что конкретно проверять "кэйсом". Уж лучше бы написал кто простенький пример, хотя бы рабочий пример. Может и он работать путью не будет, что мне мучится в этих дебрях? Ладно Win API, но эти преобразования типов просто выводят из себя. Ладно.. Ещё раз прошу, помогите, напишите простенький рабочий пример, пожалуйста, ведь не долго.

PS:
Ладно switch-case - это ещё базовый синтаксис, а вот куда дели это ? :
Код

LRESULT WndProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)//WPARAM, LPARAM, Z*LUPPARAM мать его ети!
{
    // WM_INPUT data
    //
    static RAWINPUT buffer[32];
    static RAWINPUT ** pBuffer = new RAWINPUT *[32];
    static unsigned int HEADERSIZE = sizeof(RAWINPUTHEADER);

    switch(msg)
    {

    ...

    // input handling: use raw input
    //
    case WM_INPUT:
        {
        ...


Ладно, программисты, не обижайтесь, если что не так сказал...

Это сообщение отредактировал(а) Jr13san - 11.5.2013, 21:48
PM MAIL WWW ICQ   Вверх
volatile
Дата 11.5.2013, 23:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



Цитата(Jr13san @  10.5.2013,  19:59 Найти цитируемый пост)
я заметил такую проблему на win7.

Цитата(Jr13san @  10.5.2013,  19:59 Найти цитируемый пост)
Вообщем выясняется, что в некоторых full screen-приложениях 

В каких это некоторых ?
В вин 7 нет больше консольных full screen приложений.


PM MAIL   Вверх
Jr13san
Дата 12.5.2013, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 174
Регистрация: 29.7.2008
Где: г. Павлово

Репутация: нет
Всего: нет



Цитата

В каких это некоторых ?
В вин 7 нет больше консольных full screen приложений.

Да нет, вы поймите меня правильно. Я делаю консольное приложение для fullscreen-приложений: Gothic, Gothic II. Может быть даже ключевое слово и не "fullscreen", а просто у данных приложений своя обработка событий с клавиатуры и мышки. А вот, например, в том же самом CS 1.6 и "GetAsyncKeyState" нормально работает.
Но у меня возникла проблема - я не знаю что писать дальше в этой структуре вызовов(т.е. в коде). Я вот и думаю, а будет ли вообще работать этот RawInputDevice?

Это сообщение отредактировал(а) Jr13san - 12.5.2013, 10:41
PM MAIL WWW ICQ   Вверх
volatile
Дата 12.5.2013, 23:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



Цитата(Jr13san @  12.5.2013,  10:36 Найти цитируемый пост)
Я делаю консольное приложение для fullscreen-приложений: Gothic, Gothic II.
... в том же самом CS 1.6 

Сорри, не знаю о чем вы говорите...

Цитата(Jr13san @  11.5.2013,  20:31 Найти цитируемый пост)
LRESULT WndProc(HWND hwnd, UINT 

Да, и если вы пишете все-же консольное приложение, то там в принципе нет WndProc


PM MAIL   Вверх
Jr13san
Дата 13.5.2013, 09:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 174
Регистрация: 29.7.2008
Где: г. Павлово

Репутация: нет
Всего: нет



Цитата

Сорри, не знаю о чем вы говорите...

Да хоть для программы "Калькулятор" напишите отлов событий нажатия клавиш, это не важно. Главное то, что в коде я не продвинулся дальше регистрации "девайса", который выдаёт ошибку!
Что толку ходить вокруг, да около, можно тему закрывать. Всё равно путного здесь никто ничего больше не подскажет.
Я сам не люблю писать или делать работу за других, но пытаюсь им объяснить так, чтобы они более-менее поняли как делать и у них всё было для этого. И в итоге люди сами всё делают. Здесь же я не вижу хода написания кода или структуры вызовов функций. У меня нету ни рабочего примера, ни понятного алгоритма действий, а только непонятные куски кода.
PM MAIL WWW ICQ   Вверх
volatile
Дата 13.5.2013, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



Цитата(Jr13san @  13.5.2013,  09:53 Найти цитируемый пост)
Всё равно путного здесь никто ничего больше не подскажет.


Jr13san, чтоб что-то путное подсказали, нужно сначала задать путный вопрос.
После третьего дня, кажецца я начинаю понимать что вам нужно. 
Вы хотите в консольном приложении отлавливать нажатия клавиш, фокус ввода которых находицца в другом приложении? 
так чтоле? 

да, и еще вопрос, от имени админа пробовали запускать вашу программу, которая на XP работала?

PM MAIL   Вверх
Jr13san
Дата 13.5.2013, 14:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 174
Регистрация: 29.7.2008
Где: г. Павлово

Репутация: нет
Всего: нет



Цитата

Jr13san, чтоб что-то путное подсказали, нужно сначала задать путный вопрос.

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".

Цитата

да, и еще вопрос, от имени админа пробовали запускать вашу программу, которая на XP работала?

Только что попробовал - не работает.
PM MAIL WWW ICQ   Вверх
volatile
Дата 13.5.2013, 23:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



Цитата(Jr13san @  13.5.2013,  14:44 Найти цитируемый пост)
Помогите мне дописать рабочий прототип на основе "RawInputDevice".

Jr13san, что-то я сильно сомневаюсь что RawInputDevice будет получать клавиатурный ввод из другого приложения...

Вам, имхо, нужно хук на клаву ставить. (причем в отдельной dll)
SetWindowsHookEx (WH_KEYBOARD, ...
SetWindowsHookEx (WH_KEYBOARD_LL, ...

осилите ли, не знаю. И к тому-же в игрушках может стоять защита от этого. (впрочем это предположение, с игрушками дел не имел)
PM MAIL   Вверх
Jr13san
Дата 14.5.2013, 07:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 174
Регистрация: 29.7.2008
Где: г. Павлово

Репутация: нет
Всего: нет



Говорят, что из за хуков возникают сильные лаги(задержки, подвисания). Мне бы не желательно таких вещей добавлять к и так уже "старушке Gothic".
Цитата

Вам, имхо, нужно хук на клаву ставить. (причем в отдельной dll)

Если речь идёт об инжектинге, то я пас, и, одновременно, против данного способа. Лучше уж ничего, чем такой костыль вставлять.
Ну хорошо, а может есть какие-то отдельные способы отследить нажатия только на клавиши мышки?
PM MAIL WWW ICQ   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1184 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.