Skocz do zawartości

Witamy w Nieoficjalnym polskim support'cie AMX Mod X

Witamy w Nieoficjalnym polskim support'cie AMX Mod X, jak w większości społeczności internetowych musisz się zarejestrować aby móc odpowiadać lub zakładać nowe tematy, ale nie bój się to jest prosty proces w którym wymagamy minimalnych informacji.
  • Rozpoczynaj nowe tematy i odpowiedaj na inne
  • Zapisz się do tematów i for, aby otrzymywać automatyczne uaktualnienia
  • Dodawaj wydarzenia do kalendarza społecznościowego
  • Stwórz swój własny profil i zdobywaj nowych znajomych
  • Zdobywaj nowe doświadczenia

Dołączona grafika Dołączona grafika

Guest Message by DevFuse
 

Zdjęcie
C++

[ROZWIĄZANE] Wyłapywanie zmiany wyglądu myszki

c++

Najlepsza odpowiedź 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 ) Przejdź do postu


  • Zamknięty Temat jest zamknięty
6 odpowiedzi w tym temacie

#1 Pan PrO

    Wszechpomocny

  • Użytkownik

Reputacja: 99
Zaawansowany

  • Postów:388
  • Lokalizacja:PC
Offline

Napisano 24.11.2013 12:02

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.


  • +
  • -
  • 0

#2 MarWit

    The Chosen One

  • Przyjaciel

Reputacja: 843
Czempion

  • Postów:1 485
  • GG:
  • Steam:steam
  • Imię:Marcin
  • Lokalizacja:Bystrzyca
Offline

Napisano 24.11.2013 15:48

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

marwit-0.png


#3 Pan PrO

    Wszechpomocny

  • Autor tematu
  • Użytkownik

Reputacja: 99
Zaawansowany

  • Postów:388
  • Lokalizacja:PC
Offline

Napisano 24.11.2013 23:21

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;
}

 


  • +
  • -
  • 0

#4 MarWit

    The Chosen One

  • Przyjaciel

Reputacja: 843
Czempion

  • Postów:1 485
  • GG:
  • Steam:steam
  • Imię:Marcin
  • Lokalizacja:Bystrzyca
Offline

Napisano 25.11.2013 15:47

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
  • +
  • -
  • 1

marwit-0.png


#5 Pan PrO

    Wszechpomocny

  • Autor tematu
  • Użytkownik

Reputacja: 99
Zaawansowany

  • Postów:388
  • Lokalizacja:PC
Offline

Napisano 27.11.2013 14:21

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.


  • +
  • -
  • 0

#6 MarWit

    The Chosen One

  • Przyjaciel

Reputacja: 843
Czempion

  • Postów:1 485
  • GG:
  • Steam:steam
  • Imię:Marcin
  • Lokalizacja:Bystrzyca
Offline

Napisano 27.11.2013 15:32   Najlepsza odpowiedź

#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 )
  • +
  • -
  • 1

marwit-0.png


#7 Pan PrO

    Wszechpomocny

  • Autor tematu
  • Użytkownik

Reputacja: 99
Zaawansowany

  • Postów:388
  • Lokalizacja:PC
Offline

Napisano 28.11.2013 18:23

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ź.


  • +
  • -
  • 0





Również z jednym lub większą ilością słów kluczowych: c++

Użytkownicy przeglądający ten temat: 0

0 użytkowników, 0 gości, 0 anonimowych