hi ich bin Moses
ich durchstöbere das forum und finde lauter fragen im 'WIN32 API' bereich
Wie fange ich mausereignisse von anderen Programmen ab ? (...!?...)
und die Antwort
Mit Hilfe der API f. Hook ! (...!?...)
Irgend wie glaube ich keiner weiss das so genau kann das sein
ich suche auch die Antwort dafür
aber irgenwie ??????
íhr was zum Thema:
Dazu installiert man mit der Funktion SetWindowsHookEx einen Windows-Hook, den man nach Benutzung UnhookWindowsHookEx mit wieder freigibt. In der c't 5/99 war ein Artikel. der das Komma am Ziffernblock abfängt und den dann in einen Punkt umwandelt. Das ganze war in einer DLL mit zwei Funktionen implementiert, die Heino Tiedemann nach Delphi übersetzt hat.
Im Hauptprogramm muß nun noch z.B. im OnCreate des Hauptformulars die DLL importiert werden und der Hook aktiviert werden, beim Beenden des Programms wird der Hook wieder deaktiviert und die DLL wird aus dem Speicher gekickt:
type
TMainForm = class(TForm)
[..]
private
{ Private-Deklarationen }
Success: Boolean;
{Handle der DLL}
hDLL: HINST;
{Handle auf die DLL-Funktion 'DLLInit'}
InitProc : procedure (hDLL: HINST; install: BOOL); stdcall;
[..]
procedure TMainForm.FormCreate(Sender: TObject);
begin
//DLL Einbinden
hDLL := LoadLibrary('PunktDLL.dll');
if hDLL = 0 then
begin
MessageBox(0,'PunktDLL.dll nicht gefunden',
'kritischer Fehler',MB_OK or MB_ICONSTOP);
Success := FALSE;
//Wird Im OnDestroy abgefragt
Application.Terminate
end
else begin
Success := TRUE;
//Funktion aus DLL laden
InitProc := GetProcAddress(hDLL,'DLLInit');
//Funktion aus DLL aufrufen; TRUE schaltet den Hook ein
InitProc(hDLL,TRUE)
end
end;
procedure TMainForm.FormDestroy(Sender: TObject);
begin
//DLL Freigeben
If Success then
//Funktion aus DLL aufrufen; FALSE schaltet den Hook aus
InitProc(hDLL,FALSE);
if hDLL <> 0 then FreeLibrary(hDLL);
end;
---------------------------------------------------------------------------
library PunktDLL;
(****************************
* Punkt (Hook-DLL) *
* Übersetzt aus c't 5/99 *
* von Heino Tiedemann *
****************************)
uses
SysUtils,
Classes,
windows,
Messages;
var
MyHook: HHOOK; {Handle auf Die Hook Funktion}
{*********************
* Hook Funktion *
* (Callback) *
**********************}
Function PunktHook(code: Integer; // hook code
HwParam: WPARAM; // virtual-key code
HlParam: LPARAM // keystroke-message information
): LRESULT; Stdcall;
var Scancode : LPARAM;
myWnd : HWND;
begin
if Code = HC_ACTION then
begin
if HwParam=VK_DECIMAL then
begin
scancode := OemKeyscan(Ord('.')) shl 16; //Scanncode vom punkt ermitteln
HlParam := hLParam and $FF00FFFF; //durchmaskieren aus einem
HlParam := HlParam or scancode; //Komma einen Punkt machen
hwParam := 190;
MyWnd := GetFocus(); //HensterHandle besorgen
if MyWnd=0 then //Etwa eine Dosbox
MyWnd := GetForegroundWindow();//dann geht Diese Methode
if (hlParam and $8000000) = 0 then
postMessage(myWnd,WM_KeyDown,hwParam,hlParam);
if (hlParam and $8000000) = $8000000 then
postMessage(myWnd,WM_KeyUp,hwParam,hlParam);
Result := 1;
end else
Result := CallNextHookEx(myHook,code,HwParam,HlParam);
end else
Result := CallNextHookEx(myHook,code,HwParam,HlParam);
end;
{************************************
* Initialisierung der HOOK-Fuktion *
*************************************}
procedure DLLInit(hDLL: HINST; install: BOOL); stdcall
begin
if install = TRUE
then
//Hook setzen; mit callbackfunktion "PunktHook"
myHook := SetWindowsHookEx(WH_KEYBOARD,PunktHook,hDLL,0)
e
ich durchstöbere das forum und finde lauter fragen im 'WIN32 API' bereich
Wie fange ich mausereignisse von anderen Programmen ab ? (...!?...)
und die Antwort
Mit Hilfe der API f. Hook ! (...!?...)
Irgend wie glaube ich keiner weiss das so genau kann das sein
ich suche auch die Antwort dafür
aber irgenwie ??????
íhr was zum Thema:
Dazu installiert man mit der Funktion SetWindowsHookEx einen Windows-Hook, den man nach Benutzung UnhookWindowsHookEx mit wieder freigibt. In der c't 5/99 war ein Artikel. der das Komma am Ziffernblock abfängt und den dann in einen Punkt umwandelt. Das ganze war in einer DLL mit zwei Funktionen implementiert, die Heino Tiedemann nach Delphi übersetzt hat.
Im Hauptprogramm muß nun noch z.B. im OnCreate des Hauptformulars die DLL importiert werden und der Hook aktiviert werden, beim Beenden des Programms wird der Hook wieder deaktiviert und die DLL wird aus dem Speicher gekickt:
type
TMainForm = class(TForm)
[..]
private
{ Private-Deklarationen }
Success: Boolean;
{Handle der DLL}
hDLL: HINST;
{Handle auf die DLL-Funktion 'DLLInit'}
InitProc : procedure (hDLL: HINST; install: BOOL); stdcall;
[..]
procedure TMainForm.FormCreate(Sender: TObject);
begin
//DLL Einbinden
hDLL := LoadLibrary('PunktDLL.dll');
if hDLL = 0 then
begin
MessageBox(0,'PunktDLL.dll nicht gefunden',
'kritischer Fehler',MB_OK or MB_ICONSTOP);
Success := FALSE;
//Wird Im OnDestroy abgefragt
Application.Terminate
end
else begin
Success := TRUE;
//Funktion aus DLL laden
InitProc := GetProcAddress(hDLL,'DLLInit');
//Funktion aus DLL aufrufen; TRUE schaltet den Hook ein
InitProc(hDLL,TRUE)
end
end;
procedure TMainForm.FormDestroy(Sender: TObject);
begin
//DLL Freigeben
If Success then
//Funktion aus DLL aufrufen; FALSE schaltet den Hook aus
InitProc(hDLL,FALSE);
if hDLL <> 0 then FreeLibrary(hDLL);
end;
---------------------------------------------------------------------------
library PunktDLL;
(****************************
* Punkt (Hook-DLL) *
* Übersetzt aus c't 5/99 *
* von Heino Tiedemann *
****************************)
uses
SysUtils,
Classes,
windows,
Messages;
var
MyHook: HHOOK; {Handle auf Die Hook Funktion}
{*********************
* Hook Funktion *
* (Callback) *
**********************}
Function PunktHook(code: Integer; // hook code
HwParam: WPARAM; // virtual-key code
HlParam: LPARAM // keystroke-message information
): LRESULT; Stdcall;
var Scancode : LPARAM;
myWnd : HWND;
begin
if Code = HC_ACTION then
begin
if HwParam=VK_DECIMAL then
begin
scancode := OemKeyscan(Ord('.')) shl 16; //Scanncode vom punkt ermitteln
HlParam := hLParam and $FF00FFFF; //durchmaskieren aus einem
HlParam := HlParam or scancode; //Komma einen Punkt machen
hwParam := 190;
MyWnd := GetFocus(); //HensterHandle besorgen
if MyWnd=0 then //Etwa eine Dosbox
MyWnd := GetForegroundWindow();//dann geht Diese Methode
if (hlParam and $8000000) = 0 then
postMessage(myWnd,WM_KeyDown,hwParam,hlParam);
if (hlParam and $8000000) = $8000000 then
postMessage(myWnd,WM_KeyUp,hwParam,hlParam);
Result := 1;
end else
Result := CallNextHookEx(myHook,code,HwParam,HlParam);
end else
Result := CallNextHookEx(myHook,code,HwParam,HlParam);
end;
{************************************
* Initialisierung der HOOK-Fuktion *
*************************************}
procedure DLLInit(hDLL: HINST; install: BOOL); stdcall
begin
if install = TRUE
then
//Hook setzen; mit callbackfunktion "PunktHook"
myHook := SetWindowsHookEx(WH_KEYBOARD,PunktHook,hDLL,0)
e
Comment