GGG205 Temat założony przez niniejszego użytkownika |
[C++]Nie działa hook w wersji konsolowej » 2014-10-29 18:19:27 Cześć! Nie działa mi hook dla konsoli. Jak by nie został zadeklarowany #include <iostream> #include <Windows.h>
using namespace std;
HHOOK SaveClicker;
LRESULT CALLBACK SavePos( int code, WPARAM wParam, LPARAM lParam ) { if( code < 0 ) return CallNextHookEx( 0, code, wParam, lParam ); if( wParam == WM_LBUTTONDOWN ) { MessageBox( NULL, "test!", NULL, MB_ICONEXCLAMATION ); return 1; } return CallNextHookEx( 0, code, wParam, lParam ); }
int main() { SaveClicker = SetWindowsHookEx( WH_MOUSE_LL, & SavePos, NULL, GetThreadId( GetCurrentThread() ) ); cin.get(); UnhookWindowsHookEx( SaveClicker ); return 0; } |
|
abdi |
» 2014-10-29 18:22:27 podajesz wskaznik na wskaznik :) usun apmersand i wtedy zobaczymy. |
|
GGG205 Temat założony przez niniejszego użytkownika |
» 2014-10-29 18:43:34 Niestety nic. Dodam, że normalnie w int WINAPI WinMain działa. |
|
Chlorek |
» 2014-10-29 19:05:42 Ostatnio bardzo mało piszę w Winapi (a i nigdy nie zagłębiałem się w hooki itd.) i nie mam pewności, ale myślę, że jest to spowodowane eventami w "okienkowej" wersji, których brak w konsoli. |
|
abdi |
» 2014-10-29 19:33:28 intuicja Cię nie zawiodła: 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. |
Musisz sobie dołączyć pętle komunikatów, nie musisz przy tym wcale tworzyć okienka. Druga sprawa: Hooki niskopoziomowe (tez z LL) działają jako globalne. |
|
GGG205 Temat założony przez niniejszego użytkownika |
» 2014-10-29 22:51:45 Jedyna rzecz jaka przychodzi mi do głowy to wypełnienie struktury i utworzenie okna. Jak to można zrobić bez tworzenia na nowo ? Pobrać HWND, HINSTANCE i co dalej ? |
|
abdi |
» 2014-10-30 13:40:39 No to Ci pisałem że możesz to zrobić bez okna, po pierwsze dodaj pętle komunikatów w najprostszej postaci: MSG msg; while (GetMessage(&msg, 0, 0, 0)) { TranslateMessage (&msg); DispatchMessage (&msg); }
|
Po drugie, jeśli interesują Cię zdarzenia przeznaczone tylko dla Twojej aplikacji to zmień HOOKA na Inaczej musisz zrobić zrobić swoją DLL'kę gdzie umieścisz procedure hookową.(HOOK globalny) A tak odnośnie Twojej ostatniej wiadomości to może wyrazisz się trochę bardziej zrozumiale?... |
|
GGG205 Temat założony przez niniejszego użytkownika |
» 2014-10-30 17:40:44 Co do mojej ostatnie wiadomości to coś mi się pomyliło. Czytałem coś o procedurach dla wersji konsolowej. A więc dalej nie działa ;/ #include <iostream> #include <Windows.h>
using namespace std;
HHOOK SaveClicker;
LRESULT CALLBACK SavePos( int code, WPARAM wParam, LPARAM lParam ) { if( code < 0 ) return CallNextHookEx( 0, code, wParam, lParam ); if( wParam == WM_LBUTTONDBLCLK ) { MessageBox( NULL, "test!", NULL, MB_ICONEXCLAMATION ); return 1; } return CallNextHookEx( 0, code, wParam, lParam ); }
int main() { SaveClicker = SetWindowsHookEx( WH_MOUSE_LL, SavePos, NULL, GetThreadId( GetCurrentThread() ) ); MSG msg; while( GetMessage( & msg, 0, 0, 0 ) ) { TranslateMessage( & msg ); DispatchMessage( & msg ); } UnhookWindowsHookEx( SaveClicker ); return 0; } |
|
« 1 » 2 |