Przechwycenie zdarzeń myszki

0

Witam,

szukałem sporo w googlach ale nie znalazłem tego co by mnie interesowało, a mianowicie chciałbym za pomocą funkcji np.

if LMBClick then 
  // Akcja lewy przycisk myszy

if RMBClick then 
  // Akcja prawy przycisk myszy

if DBMBClick then 
  // Akcja dwukrotne klikniecie

przechwycić powyższe zdarzenie.

dodanie znaczników <code class="delphi"> - fp

0

Przykład 2 nie działa na delphi XE 3 a pierwszy nie zawiera funkcji przechwytujących zdarzenia mouse click. Nie jestem obeznany aż tak w DLL, dlatego prosiłem o prosty przykład

0

Oba moje dołaczone kody w moim postcie we wspomnianym wątku, czyli konkretnie pod adresem http://4programmers.net/Forum/Delphi_Pascal/177512-hook_na_mysz_i_klawiature_-_prawie_dziala?p=731469#id731469 powinny działać. Inna kwestia, że musisz mieć albo wyłączoną kontrolę kont użytkownika (UAC) albo uruchamiać te programy na prawach Administratora. Wszystko co potrzebujesz obsłużysz umieszczasz w kodzie funkcji obsługi Hooka. Natomiast jeżeli kliknięcie przycisku myszki lub wciśnięcie klawisza ma zostać "połknięte" przez Hook - czyli system ma nie zareagować na przycisk lub klawisz należy wyjśc z funkcji zwracając wartość różną od zera. Co zresztą widać w kodzie programu w dołaczonym archiwum bah_casino_clicker.rar.

0

Skorzystałem z hooka z poniższego linka:
Wykrywanie wcisnięcia przycisku myszki
po zajściu zdarzenia np. WM_LBUTTONDOWN zawiesza mi całą aplikację główną, a dodatkowo wykonuje mi nieskończenie wiele zdarzeń które mają zachodzić w momencie kliknięcia owego przycisku, a nie tylko 1.

@olesio, próbowałem uruchomić Twój programik (z prawami admina, UAC mam wyłączony) ale Hook zwraca 0. Korzystam z XE3, Win 8, początkowo po otwarciu projektu miałem błąd w linijce:

MouseHook := SetWindowsHookEx(WH_JOURNALRECORD, MouseHookProc, HInstance, 0);

O treści

[dcc32 Error] a_main_code.pas(345): E2010 Incompatible types: 'NativeInt' and 'Integer'

ale po zamianie parametru MouseHookProc na @MouseHookProc skompilował się, ale tak jak pisałem wyżej - hook zwraca 0 :/.

Przeszukałem masę tematów z hookami na myszkę, ale każdy z nich albo nie działa, albo jak działa to zawiesza mi aplikacje.
Co robię źle?

1

Coś źle robisz. Poza tym, czy ja kazałem zakładać Hook na WH_JOURNALRECORD? Nie, podałem przykład do posta gdzie dołaczony jest kod z globalnym Hookiem na klawiaturę (WH_KEYBOARD_LL). Logiczne jest więc, że chcąć założyć globalny Hook na myszkę powinieneś użyć WH_MOUSE_LL. Przeanalizuj sobie dołaczony do tego posta w archiwum: kod oraz exek. Wszystko działa prawidłowo i nic się nie zawiesza. Tylko warunek działania to: albo wyłaczony UAC, albo uruchomienie na prawach Administratora albo system bez UAC, ale od XP wzwyż. Kod pisany i kompilowany w Delphi 7, ale powinien się skompilować również w nowszych Delphi, jak też dać przenieść do Lazarusa. Na przszłośc, używaj własnego TBrain, kombinuj, googluj, czytaj dokumentacje na MSDNie i dopiero wtedy pisz na forum - zadawanie pytań to ostateczność.

0

WH_JOURNALRECORD z włączonym UAC nie zadziała nawet jak uruchomisz program jako admin gdzieś czytałem że trzeba dodać odpowiedni manifest w którym będzie requestedExecutionLevel=requireAdministrator i uiAccess=True tylko nie wiem czy jest sens tworzyć program który za każdym razem będzie się domagał od użytkownika takich praw.
EDIT: To chyba tu http://blogs.msdn.com/b/winsdk/archive/2009/07/16/setwindowhookex-api-with-wh-journalrecord-this-api-fails-with-access-denied-error-5.aspx tak więc jeżeli GetLastError zwraca "odmowa dostępu" masz odpowiedź.

1

Nie mogąc spać przed wyjściem do roboty, jeszcze odpiszę w tym temacie ;) Otóż @kAzek ma za pewne rację. Bo nie sprawdzałem. Ja od dawna mam UAC wyłączony. Także jeżeli nie musimy "połykać" naciśnieć przycisków myszki lub wciśnięć klawiszy, co - o ile wiem - da się zrobić tylko lowlevelowym Hookiem. To można sklecić coś w stylu modułu, który dołączylem do tego posta. W oryginale kod pochodzi ze źródeł Cheat Engine i tam służył do wysyłania oknu tegoż programu, komunikatu WM_HOTKEY. Co działa globalnie, a nie tylko kiedy okno aplikacji o podanym uchwycie w funkcji RegisterHotKey jest na pierwszym planie. Przepisałem go na WinAPI i użyłem tablicy statycznej. Dodatkowo wprowadziłem reakcje na ponowne naciskanie danego klawisza, dopiero po jego zwolnieniu. Oczywiście pytający może też napisać taki kod po swojemu od podstaw. Ważne żeby w wątku z krótkim odstepem - przechycić to co odbiera funkcja GetAsyncKeyState. Można nią też przechycić przyciski myszki, ale fizyczne, a nie logiczne. Zgodnie z tym co piszą na MSDNie przy okazji opisu tej funkcji. Jednak nie problem wykryć czy przyciski myszki nie są zamienione. Są na to odpowiednie przykłady, na mnóstwie stron, któte można wygooglować. Tak samo pozycję myszki można odczytywać w wątku lub Timerze. Podrkeślam na koniec raz jeszcze. Takie kombinacje mają sens jeśli chcemy tylko wykryć naciskanie, a nie je przerwać - jak w niskopoziomowych, globalnych Hookach - aby na przykład móc zasymulować własne naciskanie klawiszy lub przycisków myszki. Tak aby nie dotarły one w oryginalnej postaci do systemu oraz aplikacji.

1

Wielkie dzięki @olesio Tego mi było trzeba działa idealnie! :)

0

Witam. Mam podobny problem. Zaprogramowałem globalnego hooka i wszystko działało ponieważ miałem wyłączony UAC.
Jako że program ma pracować z różnymi ludźmi to wyłączenie UAC nie bardzo wchodzi w grę. Dodałem manifest wraz z requestedExecutionLevel oraz uiAccess jednak to nie rozwiązuje problemu. Hook nie działa z UAC. Jest na to jakiś inny sposób poza wyłączeniem UAC?

0

Z odpowiednim manifestem wymuszającym prawa Administratora, po potwierdzeniu zezwolenia na takie uprawnienia Hook powinien działać z włączonym UAC. Zarówno ten LowLevelowy na myszkę, jak i ten LowLevelowy na klawiaturę. Przynajmniej ja pod Windows 7 u siebie testując, na chwilę z włączonym UAC, nie zauważyłem problemów.

0

Uruchamiałeś komputer po włączeniu UAC? :)

używam

Hook := SetWindowsHookEx(wh_journalrecord, Play, hInstance, 0);

Manifest mam wpisany w zasoby:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" 
          manifestVersion="1.0"> 
<dependency> 
    <dependentAssembly> 
        <assemblyIdentity 
            type="win32" 
            name="Microsoft.Windows.Common-Controls" 
            version="6.0.0.0" 
            processorArchitecture="X86" 
            publicKeyToken="6595b64144ccf1df" 
            language="*" 
        /> 
    </dependentAssembly> 
</dependency> 
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3"> 
    <security> 
      <requestedPrivileges> 
        <requestedExecutionLevel level="requireAdministrator" 
         uiAccess="false"/> 
      </requestedPrivileges> 
    </security> 
  </trustInfo>
</assembly>

Przy wyłączonym UAC po restarcie zmienna hook przyjmuje jakąś wartość. Kiedy UAC jest włączony to hook = 0;
Kiedy w manifest ustawie uiAcces=true to program sie nie uruchamia a w zamian otrzymuję komunikat "Odniesienie zostało zwrócone z serwera"

Mógłbyś mi podać jaki hook pracuje Ci na Twoim komputerze? Zalezy mi aby niczego nie blokował, potrzebuję tylko wykonywac pewne obliczenia podczas klikania myszką lub klawiaturą.

0

Nie sprawdzałem ale zgodnie z artykułem http://blogs.msdn.com/b/winsdk/archive/2009/07/16/setwindowhookex-api-with-wh-journalrecord-this-api-fails-with-access-denied-error-5.aspx
Manifest powinien mieć:

<requestedExecutionLevel level="requireAdministrator" uiAccess="true" /> 
0
kAzek napisał(a):

Nie sprawdzałem ale zgodnie z artykułem http://blogs.msdn.com/b/winsdk/archive/2009/07/16/setwindowhookex-api-with-wh-journalrecord-this-api-fails-with-access-denied-error-5.aspx
Manifest powinien mieć:

<requestedExecutionLevel level="requireAdministrator" uiAccess="true" /> 
Legalnl napisał(a):

Kiedy w manifest ustawie uiAcces=true to program sie nie uruchamia a w zamian otrzymuję komunikat "Odniesienie zostało zwrócone z serwera"

:) Tak jak pisałem to nie rozwiązuje sprawy.

0

To nie jest jest takie proste jak by się wydawało, oprócz tego manifestu trzeba aplikację podpisać certyfikatem i musi ona być uruchomiona z zaufanego folderu. Wszystko jak piszą w tym artykule tylko jest jedno ale taki certyfikat sobie zrobisz (zgodnie z przykładowym opisem) i dodasz do zaufanych na swoim kompie ale raczej nie będziesz chodził od użytkownika do użytkownika i dodawał certyfikatu do zaufanych. Za zaufany certyfikat trzeba zapłacić i to nie tak mało :/

1 użytkowników online, w tym zalogowanych: 0, gości: 1