Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Hook soll virtuelle Tastencodes zurückliefern (https://www.delphipraxis.net/45992-hook-soll-virtuelle-tastencodes-zurueckliefern.html)

jfheins 16. Mai 2005 11:20


Hook soll virtuelle Tastencodes zurückliefern
 
Also, ich habe die Hook-dll von Aya, die bei LuckieSpy dabei war.

Nun siehtihr code aber so aus:
Delphi-Quellcode:
function KeyboardProc(nCode: Integer; wParam: LongWord; lParam: LongWord): LongWord; stdcall;
var
  LastKey: Char;
  KeyState: TKeyboardState;
begin
  Result:=CallNextHookEx(hHook,nCode,wParam,lParam);
  if nCode<0 then
    Exit
  else begin
    KeyboardLayout:=GetKeyboardLayout(0);
    GetKeyboardState(KeyState);
    if ToAsciiEx(wParam,MapVirtualKeyEx(wParam,2,KeyboardLayout),KeyState,@LastKey,0,KeyboardLayout)>0 then
      Key:=Ord(LastKey) // Hier wird ein ASCII-Wert zurückgegeben
    else
      Key:=wParam; // Und hier ein virtueller Tastencode
    if (lParam and $80000000)=0 then
      if not (wParam in [16,17,18]) or GetShiftKeys then
        PostMessage(hwndBuffer^,WM_KEYBOARD_HOOK,Key,GetActiveWindow);
  end;
end;
Nun dachte ich, man könnte die ganzen Abfragen einfach wegmachen und das dann so schreiben:
Delphi-Quellcode:
  Result:=CallNextHookEx(hHook,nCode,wParam,lParam);
  if nCode<0 then
    Exit
  else begin
    if (lParam and $80000000)=0 then
      if not (wParam in [16,17,18]) or GetShiftKeys then
        PostMessage(hwndBuffer^,WM_KEYBOARD_HOOK,wParam,GetActiveWindow);
  end;
Nur ist jetzt folgendes Problem: sobald ich die dll kompiliere, und verwende gibt's immer beim Loslassen einer Taste einen Runtime-Error XXX

Sogar, wenn ich einfach nur den Source ohne Änderungen kompiliere.

Außerdem ist die erzeugte dll größer als die, die beim LuckieSpy dabei war, selbst wenn ich letztere mit upx entpacke ...

Ich brauche die VK', weil ich nachher die Tastenfolge wiedergeben möchte, und Keybd_Event einen VK will ...

Olli 2. Jul 2005 10:21

Re: Hook soll virtuelle Tastencodes zurückliefern
 
Zitat:

Zitat von jfheins
Nur ist jetzt folgendes Problem: sobald ich die dll kompiliere, und verwende gibt's immer beim Loslassen einer Taste einen Runtime-Error XXX

Sogar, wenn ich einfach nur den Source ohne Änderungen kompiliere.

Jetzt wäre a.) die Frage welche Delphiversion die beiden verwendet haben (API-Dekl. ändern sich manchmal mit den Versionen) und b.) ob du vielleicht mal das gesamte Projekt der DLL hier anhängen könntest, so daß ich es mir nicht zusammensuchen muß. Danke.

Zitat:

Zitat von jfheins
Außerdem ist die erzeugte dll größer als die, die beim LuckieSpy dabei war, selbst wenn ich letztere mit upx entpacke ...

DLLs nie mit einem PE-Packer bearbeiten!!! PE/EXE notfalls, DLL, nein! Die Größe hängt von deiner Delphiversion ab.

Zitat:

Zitat von jfheins
Ich brauche die VK', weil ich nachher die Tastenfolge wiedergeben möchte, und Keybd_Event einen VK will ...

Die Konvertierungsfunktionen sind ja gerade die, die du raufgeworfen hast. Warum beschwerst du dich also?

DP-Maintenance 2. Jul 2005 10:48

DP-Maintenance
 
Dieses Thema wurde von "alcaeus" von "Sonstige Fragen zu Delphi" nach "Windows API / MS.NET Framework API" verschoben.

Esolit 2. Jul 2005 12:02

Re: Hook soll virtuelle Tastencodes zurückliefern
 
Zitat:

Zitat von Olli
DLLs nie mit einem PE-Packer bearbeiten!!! PE/EXE notfalls, DLL, nein!

Kurze Zwischenfrage: Und wenn ich die DLL als Resource mit in die Exe einkompiliere und dann mit UPX packe? Was soll denn da schief gehen?

SirThornberry 2. Jul 2005 12:10

Re: Hook soll virtuelle Tastencodes zurückliefern
 
@Esolit: In diesem Fall extrahierst du ja die DLL aus der Exe bevor du diese mit LoadLibrary lädst und durch das extrahieren ist diese ja dann nicht mehr in der UPX Anwendung.

Esolit 4. Jul 2005 00:38

Re: Hook soll virtuelle Tastencodes zurückliefern
 
Zitat:

Zitat von SirThornberry
@Esolit: In diesem Fall extrahierst du ja die DLL aus der Exe bevor du diese mit LoadLibrary lädst und durch das extrahieren ist diese ja dann nicht mehr in der UPX Anwendung.

Stimmt schon, aber trotzdem wurde sie ja vorher zusammen mit der *.exe durch den UPX-Packer bearbeitet, auch wenn sie in der exe selbst "drinsteckt". In Ollis Posting klingt es ein wenig so als wäre jede auch nur kleinste Bearbeitung einer DLL mit einem solchen Packer fatal...

Olli 4. Jul 2005 00:51

Re: Hook soll virtuelle Tastencodes zurückliefern
 
Zitat:

Zitat von Esolit
Stimmt schon, aber trotzdem wurde sie ja vorher zusammen mit der *.exe durch den UPX-Packer bearbeitet, auch wenn sie in der exe selbst "drinsteckt". In Ollis Posting klingt es ein wenig so als wäre jede auch nur kleinste Bearbeitung einer DLL mit einem solchen Packer fatal...

Sorry, wenn das so klang. Aufgrund der völlig korrekten Antwort von SirThornberry habe ich keinen Grund gesehen hier zu reagieren.

Natürlich wird die DLL damit implizit auch gepackt. Allerdings ist sie ja vorher ungepackt als Ressource eingefügt worden. Logischerweise wird sie also bspw. zur Laufzeit der EXE auch wieder ungepackt extrahiert. Somit besteht kein Risiko.

Hingegen bei EXE-Packern mit denen man DLLs richtig explizit bearbeitet, zieht der Mechanismus von Windows nicht mehr, welcher es erlaubt die gleiche DLL im Speicher zwischen mehreren Prozessen zu teilen (im Sinne von "to share", nicht "to divide").

jfheins 4. Jul 2005 20:34

Re: Hook soll virtuelle Tastencodes zurückliefern
 
Zitat:

Zitat von Olli
Zitat:

Zitat von jfheins
Ich brauche die VK', weil ich nachher die Tastenfolge wiedergeben möchte, und Keybd_Event einen VK will ...

Die Konvertierungsfunktionen sind ja gerade die, die du raufgeworfen hast. Warum beschwerst du dich also?

... weil er mir jetzt einen Runtime-Error gibt ? (Was komisch, dass es danach nicht weitergeht :stupid: )

Projekt ? Ja, ok, such ich gleich mal. Bis dahin: Irgendwas muss doch an dem DLL-Sourcecode falsch sein, oder ?
Ich meine, zwischen D7 (ich) und D6 (Aya) dürften doch nicht derartige Unterschiede liegen... :?

(imho entspricht der Quellcode nicht der DLL ...)

Ich brauche es zwar inzwischen nicht mehr so dringend, aber nützlich ist's allemal :mrgreen:


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:12 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz