![]() |
Keyhook delphi 2009
Hi,
ich habe folgendes problem. Für einen keyhook verwende ich folgenden code:
Delphi-Quellcode:
Das Programm dazu
library HookLib;
uses Windows, Messages, SysUtils, Dialogs; type PHookRec = ^THookRec; THookRec = record AppHnd: Integer; MemoHnd: Integer; end; var Hooked: Boolean; hKeyHook, hMemo, hMemFile, hApp: HWND; PHookRec1: PHookRec; function KeyHookFunc(Code, VirtualKey, KeyStroke: Integer): LRESULT; stdcall; var KeyState1: TKeyBoardState; AryChar: array[0..1] of Char; Count: Integer; begin Result := 0; if Code = HC_NOREMOVE then Exit; Result := CallNextHookEx(hKeyHook, Code, VirtualKey, KeyStroke); if Code < 0 then Exit; if Code = HC_ACTION then begin if ((KeyStroke and (1 shl 30)) <> 0) then if not IsWindow(hMemo) then begin hMemFile := OpenFileMapping(FILE_MAP_WRITE, False, 'Global7v9k'); PHookRec1 := MapViewOfFile(hMemFile, FILE_MAP_WRITE, 0, 0, 0); if PHookRec1 <> nil then begin hMemo := PHookRec1.MemoHnd; hApp := PHookRec1.AppHnd; end; end; if ((KeyStroke and (1 shl 30)) <> 0) then begin GetKeyboardState(KeyState1); Count := ToAscii(VirtualKey, KeyStroke, KeyState1, AryChar, 0); if Count = 1 then begin SendMessage(hMemo, WM_CHAR, Ord(AryChar[0]), 0); PostMessage(hApp, WM_USER + 1678, Ord(AryChar[0]), 0); end; end; end; end; function StartHook(MemoHandle, AppHandle: HWND): Byte; export; begin Result := 0; if Hooked then begin Result := 1; Exit; end; if not IsWindow(MemoHandle) then begin Result := 4; Exit; end; hKeyHook := SetWindowsHookEx(WH_KEYBOARD, KeyHookFunc, hInstance, 0); if hKeyHook > 0 then begin hMemFile := CreateFileMapping($FFFFFFFF, // $FFFFFFFF gets a page memory file nil, // no security attributes PAGE_READWRITE, // read/write access 0, // size: high 32-bits SizeOf(THookRec), // size: low 32-bits //SizeOf(Integer), 'Global7v9k'); // name of map object PHookRec1 := MapViewOfFile(hMemFile, FILE_MAP_WRITE, 0, 0, 0); hMemo := MemoHandle; PHookRec1.MemoHnd := MemoHandle; hApp := AppHandle; PHookRec1.AppHnd := AppHandle; {set the Memo and App handles to the mapped file} Hooked := True; end else Result := 2; end; function StopHook: Boolean; export; begin if PHookRec1 <> nil then begin UnmapViewOfFile(PHookRec1); CloseHandle(hMemFile); PHookRec1 := nil; end; if Hooked then Result := UnhookWindowsHookEx(hKeyHook) else Result := True; Hooked := False; end; procedure EntryProc(dwReason: DWORD); begin if (dwReason = Dll_Process_Detach) then begin if PHookRec1 <> nil then begin UnmapViewOfFile(PHookRec1); CloseHandle(hMemFile); end; UnhookWindowsHookEx(hKeyHook); end; end; exports StartHook, StopHook; begin PHookRec1 := nil; Hooked := False; hKeyHook := 0; hMemo := 0; DLLProc := @EntryProc; EntryProc(Dll_Process_Attach); end.
Delphi-Quellcode:
Jedoch kommen bei mir in der memo nur komische japanische zeichen an ... o_O kann das an einer neuen codierung unter 2009 liegen oder was mach ich falsch?
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; const DLLNAME = 'HookLib.dll'; function StartHook(MemoHandle, AppHandle: HWND): Byte; stdcall; external DLLNAME; function StopHook: Boolean; stdcall; external DLLNAME; type TForm1 = class(TForm) Button1: TButton; Memo1: TMemo; Button2: TButton; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin StartHook(Form1.Memo1.Handle,Application.Handle); end; procedure TForm1.Button2Click(Sender: TObject); begin if StopHook then begin ShowMessage('Dismounted hook'); end else begin ShowMessage('Failed to dismount'); end; end; end. MfG - Ghost007 |
Re: Keyhook delphi 2009
hab zwar nicht verstanden was genauch gemacht wird, aber änder mal
Delphi-Quellcode:
nach
AryChar: array[0..1] of Char;
Delphi-Quellcode:
Bekommst du eigentlich Compilerwarnungen?
AryChar: array[0..1] of AnsiChar;
|
Re: Keyhook delphi 2009
Hm,
macht keinen unterschied. Btw ich benutze windows vista, falls das relevant ist. |
Re: Keyhook delphi 2009
ToAscii ist komischer Weise als Char definiert, also dürfte die Änderung des Char-Arrays eher mehr Probleme bereiten
versuch es mal mit ToUnicode statt ToAscii [add] aber ich find den Code eh etwas eigenartig ... wozu die globalen Variablen und dann nochmal die Handles in einer MMF :gruebel: |
Re: Keyhook delphi 2009
Macht genauso keinen unterschied :wall:
|
Re: Keyhook delphi 2009
sind DLL und EXE mit D2009 kompiliert?
|
Re: Keyhook delphi 2009
Zitat:
//Edit: okay, das tounicode war zwar drin und er hat nicht gemeckert, lag jedoch daran, dass ich vergessen hatte zu kompilieren. Hatte einen parameter vergessen. Die zeichen werden nun richtig angezeigt. Eine abschlussfrage hätte ich noch. Kann ich irgendwie verhindern, dass die tasten für das aktuell im fokus befindliche programm als gedrückt gesendet werden? Quasi abfangen/umleiten. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:02 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz