Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Не могу поймать мышь


Автор: TeeT 27.12.2005, 11:12
Ловлю мышь:
Код

#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
В чем проблема?

Автор: Earnest 27.12.2005, 11:36
Цитата
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.


Автор: TeeT 27.12.2005, 12:18
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

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

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

Автор: TeeT 28.12.2005, 12:40
Earnest
Цитата

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

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

Да мне нужен глобальный хук, я пишу диплом на тему "Идентификация пользователя по клавиатурному почерку и оссобеностям работы с манипулятором "мышь"", в принципе мне и клавиатуру надо будет ловить smile

Автор: Fixin 28.12.2005, 22:54
Хуки всегда должны быть б динамической библиотеке. Ты пробовал переместить процедуру хука в дллку?

Автор: KAdot 28.12.2005, 23:19
Цитата
Хуки всегда должны быть б динамической библиотеке

не обязательно. в NT можно сделать глобальный хук из экзе. для мыши, допустим, это будет WH_MOUSE_LL

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)