←  Pytania

AMXX.pl: Support AMX Mod X i SourceMod

»

C++
[ROZWIĄZANE] Wyłapywanie zmiany wyglądu my...


Best Answer MarWit 27.11.2013 15:32

#include <Windows.h>
#include <stdio.h>

HHOOK hMouseHook;

LRESULT CALLBACK mouseProc ( int nCode, WPARAM wParam, LPARAM lParam )
{
	if( ( ( CWPRETSTRUCT * ) lParam ) -> message == WM_SETCURSOR ) {
		printf( "WAT" );
	}
	return CallNextHookEx( hMouseHook, nCode, wParam, lParam );
}

int main(int argc, char** argv)
{
	hMouseHook = SetWindowsHookEx( WH_CALLWNDPROCRET, mouseProc, NULL, GetCurrentThreadId( ) );
	
	if( hMouseHook == NULL ) return 0;

	MSG msg;
	while ( GetMessage( & msg, NULL, 0, 0 ) ) { 
		TranslateMessage( & msg );
		DispatchMessage( & msg );
	}
	
	UnhookWindowsHookEx( hMouseHook );
	return 0;

}
W teorii powinno smigac, w praktyce nie musi ( tzw. wydaje mi sie ze globalnego hooka mozna zrobic tylko uzywajac DLL ) Go to the full post
Locked

  • +
  • -
Pan PrO's Photo Pan PrO 24.11.2013

Witam. Jaka funkcja służy do wychwytywania zmiany animacji myszki ??. Dokładnie to chcę zrobić program, który po zmianie strzałki w "rękę" automatycznie wykonuje kliknięcie LPM. Będę wdzięczny za każdą pomoc.

Quote

  • +
  • -
MarWit's Photo MarWit 24.11.2013

Hook 'SetWindowsHookEx' na 'WH_CALLWNDPROCRET' i wykrywanie wywołania 'WM_SETCURSOR', sprawdzanie nazwy kursora i wywołanie odpowiedniego PostMessage/SendInput
Quote

  • +
  • -
Pan PrO's Photo Pan PrO 24.11.2013

Wzorowałem się innym kodem, bo nie znam za bardzo C/C++, ale udało mi się stworzyć takie coś tylko nie wiem czy dobrze zrobiłem

 

#include <Windows.h>
#include <stdio.h>

HHOOK hMouseHook;

int main(int argc, char** argv)
{
    HANDLE hThread;
    DWORD dwThread;

    hThread = CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE)MyMouseLogger, (LPVOID) argv[0], NULL, &dwThread);
    if (hThread)
        return WaitForSingleObject(hThread,INFINITE);
    else
        return 1;

}

LRESULT CALLBACK mouseProc (int nCode, WPARAM wParam, LPARAM lParam)
{
        if(pMouseStruct != NULL)
	{
        	if(wParam == WM_SETCURSOR)
        	{
            		printf("clicked"); 
        	}
    	}
    	return CallNextHookEx(hMouseHook, nCode, wParam, lParam);
}

DWORD WINAPI MyMouseLogger(LPVOID lpParm)
{
    HINSTANCE hInstance = GetModuleHandle(NULL);

    hMouseHook = SetWindowsHookEx(WH_CALLWNDPROCRET, mouseProc, hInstance, NULL);

    UnhookWindowsHookEx(hMouseHook);
    return 0;
}

 

Quote

  • +
  • -
MarWit's Photo MarWit 25.11.2013

Powinno być dobrze, aczkolwiek pewnie chcesz wyłapać to w innej aplikacji tak więc 3 argument SetWindowsHookEx() ustawiasz na HINSTANCE/HMODULE wątku Twojej aplikacji np. przy uzyciu
HINSTANCE hInst = GetWindowLong( FindWindow( "", "Nazwa Okna" ), GWL_HINSTANCE )
No i de facto tworzenie nowego wątku też jest tutaj zbędne wiec mozesz wszystko przenieść normalnie do main'a
Quote

  • +
  • -
Pan PrO's Photo Pan PrO 27.11.2013

Nie zależy mi, aby klikało w wybranym oknie. Mam natomiast innym problem. Ten kod, który wysłałem nie da sie skompilować, błąd jest w 11 linijce. Pomożesz go naprawić będę bardzo wdzięczny.

Quote

  • +
  • -
Best Answer MarWit's Photo MarWit 27.11.2013

#include <Windows.h>
#include <stdio.h>

HHOOK hMouseHook;

LRESULT CALLBACK mouseProc ( int nCode, WPARAM wParam, LPARAM lParam )
{
	if( ( ( CWPRETSTRUCT * ) lParam ) -> message == WM_SETCURSOR ) {
		printf( "WAT" );
	}
	return CallNextHookEx( hMouseHook, nCode, wParam, lParam );
}

int main(int argc, char** argv)
{
	hMouseHook = SetWindowsHookEx( WH_CALLWNDPROCRET, mouseProc, NULL, GetCurrentThreadId( ) );
	
	if( hMouseHook == NULL ) return 0;

	MSG msg;
	while ( GetMessage( & msg, NULL, 0, 0 ) ) { 
		TranslateMessage( & msg );
		DispatchMessage( & msg );
	}
	
	UnhookWindowsHookEx( hMouseHook );
	return 0;

}
W teorii powinno smigac, w praktyce nie musi ( tzw. wydaje mi sie ze globalnego hooka mozna zrobic tylko uzywajac DLL )
Quote

  • +
  • -
Pan PrO's Photo Pan PrO 28.11.2013

Skompilowałem kod. Po uruchomieniu otwiera sie czarna konsola. Gdy strzałka zmienia się w "rękę" niestety nie wykonuje kliknięcia :/

 

MarWit Bardzo dziękuję ci za zainteresowanie się moim problemem. Jeśli uważasz, że w C++ nie ma możliwości tego wykonać, to poproszę o zamknięcie tematu. Poczekam jeszcze na twoją odpowiedź.

Quote
Locked