Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
232 / 232 / 69
Регистрация: 30.09.2012
Сообщений: 545

Хук на клавиатуру без своей DLL не запускается на ХР, но на 7 работает отлично

05.08.2014, 19:29. Показов 2221. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Пишу глобальный хук без написания своего длл( читал, что WH_KEYBOARD_LL это позволяет, да и у меня всё с первого раза получилось ) и всё у меня на компе выходит(у меня винда 7 64 бита), и на другом компе, где винда 7 64 бита, но нет среды разработки тоже все хорошо. Но вот на 32 битной ХР-шке хук не устанавливаеться. Процедура пока ничего не делает существенного, но хук не запускаеться.
Примерный код, чтобы было яснее.
Само приложение 32 битное.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include "windows.h"
LRESULT CALLBACK MyLowLevelKeyBoardProc(int nCode, WPARAM wParam, LPARAM lParam);
//...
 
    hHook = NULL;
    hHook = SetWindowsHookEx(WH_KEYBOARD_LL,MyLowLevelKeyBoardProc,NULL,0);
    if(hHook == NULL)
        QMessageBox::information(0, "Information", "Failed");//говорим, что плохо, это окно получаем на ХР
    else
        QMessageBox::information(0, "Information", "All good");//говорим, что хорошо
 
LRESULT CALLBACK MyLowLevelKeyBoardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    if(wParam == WM_KEYDOWN)
    {
        QApplication::beep();//эта штука просто бибикает, она работает на вин7 у меня и на другой 7
    }
 
    return CallNextHookEx(hHook,nCode,wParam,lParam);
}
Так вот на Вин7 все хорошо и процедура работает отлично, но на ХР получаю окно, что все плохо, то есть хук не установлен.

Что я думал:
1. Запуск от админа. Хук может не установиться, если не быть с правами админа, но на ХР права админа есть так, что, думаю, это отпадает.
2. 32 битные либы для 32 битных систем. Компилирую я под 64 битной виндой 7, но я как бы не пишу своей длл, поетому я тут не знаю, мне кажеться, что раз длл своей нет, значит и не в этом дело.

Возможно всё дело в User32.dll, ведь код то рабочий, поетому проблема может быть в либах, но только я так и не могу понять почему хук не ставиться и что с либами сделать(опыта не хватает), поетому прошу помощи.
Возможно для опытных программистов этот вопрос прост, надеюсь на вас.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
05.08.2014, 19:29
Ответы с готовыми решениями:

Глобальный хук на клавиатуру и мышь без dll
Все пытаюсь определить время простоя системы, ни один из вариантов не работате на 64 битной системе, НО удалось поставить хуки на мышь и...

IDE: Run - все работает отлично, jar не запускается
Приветствую! Нужен совет, решение или пинок под_опу ) Написал небольшой автологин, буду его еще допиливать канешн, но на данном этапе все...

Соединение с БД отлично работает без Open()
Ребят, в общем такое дело, только впервый решил по юзать asp.net. И увидел вот такую штуку: Соединил вебформу с бд, выношу все в репитер,...

7
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33398 / 21508 / 8236
Регистрация: 22.10.2011
Сообщений: 36,904
Записей в блоге: 12
05.08.2014, 22:03
Цитата Сообщение от Chernobyl Посмотреть сообщение
//говорим, что плохо
, и сразу же вызываем GetLastError, чтобы посмотреть, почему именно все плохо... Хотя очень странно, это прекрасно работало, насколько я помню, под WinXP 32 bit...
1
232 / 232 / 69
Регистрация: 30.09.2012
Сообщений: 545
05.08.2014, 23:02  [ТС]
UI, Благодарю.
Есть ошибка, 1428 - Cannot set nonlocal hook without a module handle.
Что Вы думаете по этому поводу?
Только что прогуглил решения. 3 главных.
1. Одни говорят нужно процедуру в длл, думаю не то, ведь без длл должно быть, поетому отпадает.
2. Один сказал, что должно быть
C++
1
hHook = SetWindowsHookEx(WH_KEYBOARD_LL,MyLowLevelKeyBoardProc,NULL,GetCurrentThreadId());
Конечно же это не работает ни там ни там, тоже одпадает.
3. Нашел схожую проблему на стаковерфлоу, думаю это то, что и у меня, но не могу разобрать, что там собственно посоветовали (там си шарп). Если Вы понимаете как и что это на С++, то скажите пожалуйста.
http://stackoverflow.com/quest... -windows-7
0
 Аватар для oxyfat
68 / 65 / 21
Регистрация: 01.05.2014
Сообщений: 247
05.08.2014, 23:38
Приветствую!
Одно время назад, было это: Текстовый редактор убрать функции

Добавлено через 12 минут
Странно, что Ссылка с указанным мною пакетом находится в неуместном месте...
* то, что я пытался указать вам - полнофункциональный перехватчик, единственное - там ассоциировано на "Блокнот" - ни столь важно, увидите.
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
05.08.2014, 23:58
А по-моему, здесь все предельно понятно:

Hooks Overview
http://msdn.microsoft.com/en-u... 85%29.aspx
A global hook monitors messages for all threads in the same desktop as the calling thread.
A thread-specific hook monitors messages for only an individual thread. A global hook
procedure can be called in the context of any application in the same desktop as the
calling thread, so the procedure must be in a separate DLL module.
SetWindowsHookEx function
http://msdn.microsoft.com/en-u... 85%29.aspx
The scope of a hook depends on the hook type. Some hooks can be set only with global scope; others can also be set for only a specific thread, as shown in the following table.

Hook Scope

...
WH_KEYBOARD_LL Global only
...
1
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33398 / 21508 / 8236
Регистрация: 22.10.2011
Сообщений: 36,904
Записей в блоге: 12
06.08.2014, 00:00
Chernobyl, Чуть больше кода приведи, как именно устанавливается хук, и как организуется обработка очереди сообщений? Потому что вот это: Хук клавиатуры - как получить код нажатой клавиши (Третий раз за сегодня даю эту ссылку. Странно, что всем так хуки понадобились сразу?) прекрасно работает и на WinXP и на Win7...

Ибо LowLevelKeyboardProc callback function говорит, что
This hook is called in the context of the thread that installed it. The call is made by sending a message to the thread that installed the hook. Therefore, the thread that installed the hook must have a message loop.
1
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
06.08.2014, 00:17
Кажется, я погорячился по поводу того, что процедура хука данного
типа обязана быть в dll:

LowLevelKeyboardProc callback function
http://msdn.microsoft.com/en-u... 85%29.aspx
An application-defined or library-defined callback function used with the SetWindowsHookEx function.
...
However, the WH_KEYBOARD_LL hook is not injected into another process. Instead, the context
switches back to the process that installed the hook and it is called in its original context
.
1
232 / 232 / 69
Регистрация: 30.09.2012
Сообщений: 545
06.08.2014, 15:10  [ТС]
UI, Убежденный, Прошу прощения, что вчера не отвечал. Честно говоря, я не поклонник ночного дебага, поетому взялся за это дело сегодня с новыми силами и разрешил проблему достаточно быстро.
Мой старый код,
C++ (Qt)
1
2
3
4
5
6
    hHook = NULL;
    hHook = SetWindowsHookEx(WH_KEYBOARD_LL,MyLowLevelKeyBoardProc,NULL,0);
    if(hHook == NULL)
        QMessageBox::information(0, "Information", "Failed");//говорим, что плохо, это окно получаем на ХР
    else
        QMessageBox::information(0, "Information", "All good");//говорим, что хорошо
я заменил на вот это
C++ (Qt)
1
2
3
4
5
6
7
    HINSTANCE hinst = GetModuleHandle( NULL );
    hHook = NULL;
    hHook = SetWindowsHookEx(WH_KEYBOARD_LL,MyLowLevelKeyBoardProc,hinst,0);
    if(hHook == NULL)
        QMessageBox::information(0, "Information", "Failed with code "+QString::number(GetLastError()));
    else
        QMessageBox::information(0, "Information", "All good");
Теперь всё работает и на Хр и на 7, хотя я так и не понял, почему собственно ХР захотела именно GetModuleHandle, если кто-то знает, то буду рад услышать.
Но самое главное, что уже работает.
Всех благодарю за отлик в теме.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
06.08.2014, 15:10
Помогаю со студенческими работами здесь

Не работает глобальный хук находящийся в dll
Добрый вечер! Нужен глобальный хук подгружаемый из dll вот что имею: hookwin.h #include "hookwin_global.h" #include...

Хук на клавиатуру
Как собственно реализуется? И тяжело ли реализовать что-то вроде punto switcher-а ( только транслит последнего введенного слова ) ? ...

Поток и хук на клавиатуру
Здравствуйте. Я нуб. Изначально у меня была задача получать данные о нажатой клавиши в любой момент, и я использовал GetKeyState() и было...

Поставить хук на клавиатуру
Ребят , как сделать ? хук клавы ? Тоесть если я нажму F5 начнется какоет-то действие ... Спасибо !

Глобальный хук на клавиатуру
unit HookForm; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru