Problem z hookiem w dll (?) albo z d2k5 (?)

0

Witam.
Otóż do swojej aplikacji potrzebuje sprawdzać czy użytkownik jest idle. Robi to poprzez hook'a, którego mam założonego na klawiaturkę i myszkę. W razie kliknięcia jakiegoś klawisza, lub poruszenia myszką do swojego programu wysyłam komunikat, że user coś robi. Udało mi się napisać dll'ke, która wysyła komunikat, i w której działają hooki, ale kod jest całościowo sprawny tylko po skompilowaniu programu w d7 (dll'ka obojętnie w czym skompilowana jest taka sama). Problem objawia się tym, że jeśli "wjadę" myszką nad swój program (ten, który odbiera komunikaty, to program bardzo zwalnia i zaczyna używać pełnej mocy procesora) - natomist w d7 jest OK.

Oto kody:
dll: http://arturs.aplus.pl/forum/viewtopic.php?p=169#169
część programu: http://arturs.aplus.pl/forum/viewtopic.php?p=170#170

Proszę o pomoc :)
Dzięki :)

0

ja bym odczytywał co jakiś czas pozycję kursora myszy, a jeśli chodzi o klawiaturę to użyłbym KeySpy lub KeySpyXP zamiast bawić się z dll

0

Bez różnicy czy w dll'ce jest obsługa hooka klawierki czy nie to i tak jest błąd :/
BTW. Komponenty - ja chce sam coś napisać a nie wszystko na komponentach robic ;]

0

No cóż, moim zdaniem wszystko wydaje się ok....
Ale jak ja bawiłem sie hookami to miałem zawsze jeden mały problem a mianowice w :

CreateFileMapping(DWORD(-1),nil,PAGE_READWRITE,0,sizeof(TDane),'SharedMem');

Niekiedy CreateFileMapping niechciał utworzyć pliku bo taki już istaniał w pamięci..
Sprawdź czy on się tworzy za każdym razem, jak nie to nazwę (losową) tego pliku przekazuj w parametrze a plik wtedy twórz nie przy ładowaniu dll tylko przy inicjiowaniu hooka, - mi to pomogło, jeśli zaś nie tam jest problem to miłej zabawy... :D

0
Function SetMouseHook(Okno: Hwnd): Boolean; stdcall;
begin
Dane^.Okno:=Okno;
Dane^.HintHook := SetWindowsHookEx(WH_MOUSE, @MouseHook, Hinstance, 0);
Dane^.HintHook := SetWindowsHookEx(WH_KEYBOARD, @KeyboardHook, Hinstance, 0);
result:=Dane^.HintHook<>0;
end;

procedure UninstallHook; stdcall;
begin
if Dane^.HintHook <> 0 then UnhookWindowsHookEx(Dane^.HintHook);
end;

Nie wiem czy to jest przyczyną twojego problemu, ale dlaczego uchwyt zwrócony przez oba wywołania SetWindowsHookEx zapisujesz w to samo miejsce?
Zwalniasz też tylko jeden z nich. No chyba, że funkcja zwraca to samo nigdy nie sprawdzałem. :-/

0

pierwszy uchwyt zwalnia w momencie przypisania do drugiego. to samo mowilem mu na ircu. [to się kłócił] :>

//dop: uchwyt zanika, ale sam hook zostaje :-)

0

kAzek i nav: to nie jest powód błędu.
Nawet jeżeli wywale hooka na klawiaturę i zostawie samą myszkę to i tak jest wyżej wymieniony problem (patrz mój 1 post)

//dopisane
udało się :) thx za pomoc nav :)
btw. jakby kogoś to interesilo to w linkach do kodów jest też poprawiona wersja na samym dole :)

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