Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не могу поймать мышь, грызун не поддается 
:(
    Опции темы
TeeT
Дата 27.12.2005, 11:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Ловлю мышь:
Код

#include <windows.h>
#include <stdio.h>
#include <conio.h>

HHOOK HookHandle;

LRESULT CALLBACK
MouseProc( int nCode, WPARAM wParam, LPARAM lParam )
 {
    printf("Mouse has been moved\n");
    if( nCode < 0 )
        return CallNextHookEx( HookHandle, nCode, wParam, lParam);

    return 1;
 }


WINAPI main(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, INT nCmdShow)
{
    HookHandle = SetWindowsHookEx( WH_MOUSE, (HOOKPROC)MouseProc, GetCurrentProcess(), 0 );

    if( HookHandle )
     printf( "Hook has been installed" );
    else {
     printf( "Can't install hook" );
     getch();
     return -1;
    }
    UnhookWindowsHookEx( HookHandle );
    return 0;
}

выдает Can't install hook
В чем проблема?
PM MAIL   Вверх
Earnest
Дата 27.12.2005, 11:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

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



Цитата
dwThreadId
[in] Specifies the identifier of the thread with which the hook procedure is to be associated. If this parameter is zero, the hook procedure is associated with all existing threads running in the same desktop as the calling thread.

Т.е. ты пытаешься установить глобальный хук.
А тогда:
Цитата
The global hooks are a shared resource, and installing one affects all applications in the same desktop as the calling thread. All global hook functions must be in libraries.

Т.е. процедура глобального хука должна быть в DLL (чтобы все процессы могли к ней подключиться) и третий параметр должен на эту DLL указывать.
Может, в этом дело?

Добавлено @ 11:40
Сомневаюсь, что тебе нужен именно глобальный хук. Если нет - поставь 3-й параметр в 0:
Цитата
hMod
[in] Handle to the DLL containing the hook procedure pointed to by the lpfn parameter. The hMod parameter must be set to NULL if the dwThreadId parameter specifies a thread created by the current process and if the hook procedure is within the code associated with the current process.




--------------------
...
PM   Вверх
TeeT
Дата 27.12.2005, 12:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Earnest
Цитата

Т.е. ты пытаешься установить глобальный хук.
А тогда:
Цитата
The global hooks are a shared resource, and installing one affects all applications in the same desktop as the calling thread. All global hook functions must be in libraries.

Т.е. процедура глобального хука должна быть в DLL (чтобы все процессы могли к ней подключиться) и третий параметр должен на эту DLL указывать.
Может, в этом дело?


Наскролько я понимаю программы экспортируют только функцию перехвата, так что не обязательно в DLL просто надо чтоб функция была экспортируемой smile

Да и с NULL-ом не работает smile
PM MAIL   Вверх
Earnest
Дата 27.12.2005, 12:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

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



Цитата(TeeT @ 27.12.2005, 12:18)
Наскролько я понимаю программы экспортируют только функцию перехвата, так что не обязательно в DLL просто надо чтоб функция была экспортируемой

В общем, да. Но вопрос - может ли exe подключиться к чужому процессу как DLL - не представляю как это сделать. В приведенной цитате прямо написано - в библиотеке должна быть.
Еще попробуй все-таки ThreadID передать, а не 0. Или тебе нужно именно глобальный хук?
А еще я лично не сталкивалась с хуками в консольных приложениях. Вроде нигде не написано, что нельзя, но может в этом дело.



--------------------
...
PM   Вверх
TeeT
Дата 28.12.2005, 12:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Earnest
Цитата

Еще попробуй все-таки ThreadID передать, а не 0.

пробовал - НЕТ smile

Да мне нужен глобальный хук, я пишу диплом на тему "Идентификация пользователя по клавиатурному почерку и оссобеностям работы с манипулятором "мышь"", в принципе мне и клавиатуру надо будет ловить smile
PM MAIL   Вверх
Fixin
Дата 28.12.2005, 22:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ёжик
***


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

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



Хуки всегда должны быть б динамической библиотеке. Ты пробовал переместить процедуру хука в дллку?
PM MAIL ICQ   Вверх
KAdot
Дата 28.12.2005, 23:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 6.9.2005

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



Цитата
Хуки всегда должны быть б динамической библиотеке

не обязательно. в NT можно сделать глобальный хук из экзе. для мыши, допустим, это будет WH_MOUSE_LL
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

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


 




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


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

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