Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++]Nie działa hook w wersji konsolowej

Ostatnio zmodyfikowano 2014-10-30 23:09
Autor Wiadomość
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
C/C++
#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;
}
P-119627
abdi
» 2014-10-29 18:22:27
& SavePos

podajesz wskaznik na wskaznik :)
usun apmersand i wtedy zobaczymy.
P-119628
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.
P-119633
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.
P-119636
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.
P-119643
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 ?
P-119662
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
WH_MOUSE
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?...
P-119679
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 ;/
C/C++
#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;
}
P-119696
« 1 » 2
  Strona 1 z 2 Następna strona