Hallo Leute,
erst nochmal kurz, was ich überhaupt machen will:
- Programm starten, Form wird unsichtbar und es erscheint ein Icon in der SysTray(das tut soweit)
- über die rechte Maustaste über mein Icon erscheint ein Popup-Menü und wenn ich den Menüpunkt "Hallo". Wenn ich nun "Hallo" auswähle soll in dem Fenster(Notepad, Word, Excel, egal was!), wo sich der Cursor befindet das Wort "Hallo" eingefügt werden.
ich habe nun alle(die ich kenne) Funkionen zum Thema "Fenster-
Handle ermitteln" ausprobiert. Nichts klappt so richtig.
Jedesmal, wenn ich einen Rechtslklick auf "mein" SysTray-Symbol mache, bekomme ich nur mein Fenster-
Handle oder ein
Handle eines Controls auf meinem Formular.
Jetzt habe ich mal einen Timer eingebaut, der jede 500ms ein "GetForegroundWindow" absetzt, das ermittelte
Handle merke ich mir und verwende dann das, wenn die entsprechende Aktion über das Popup-Menü meines SysTray-icons aufgerufen wird. Das funktioniert!
Ich finde die Lösung aber etwas ... "uncool". Jetzt habe ich mir gedacht, wie wäre es denn, wenn ich einen Hook setze, der mich jedesmal informiert, wenn ein Fenster aktiviert wird. Leider gibt es keinen speziellen WH_WINDOWCHANGE oder sowas. Jetzt habe ich es mal so probiert:
Delphi-Quellcode:
Function myFirstHook(code: Integer;
HwParam: WPARAM;
HlParam: LPARAM
): LRESULT; Stdcall;
var
myWnd : HWND;
begin
if Code = HC_ACTION then
begin
myWnd := GetFocus();
if myWnd = 0 then
myWnd := GetForegroundWindow();
PostMessage(myHandle, myMessage, myWnd, hlParam);
end;
Result := CallNextHookEx(WH_CALLWNDPROC, Code, HwParam, HlParam);
end;
die Werte für myHandle und myMessage habe ich beim Initialisieren des Hooks mitgegeben:
Delphi-Quellcode:
hDLL := LoadLibrary('
Project1.dll');
if hDLL = 0
then
begin
MessageBox(0,'
Project1.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');
InitProc(hDLL,TRUE,self.handle,WM_WINDOWCHANGE)
end;
der Init-Hook sieht so aus:
Delphi-Quellcode:
procedure DLLInit(hDLL: HINST; install: BOOL; aHandle : HWnd; aMessage : Integer); stdcall
begin
myHandle := aHandle;
myMessage := aMessage;
if install = TRUE
then
myHook := SetWindowsHookEx(WH_CALLWNDPROC,myFirstHook,hDLL,0)
else
UnhookWindowsHookEx(myHook)
end;
So, das ganze hab' ich dann mal laufen lassen .. und ... naja ich musste den Prozess über den TaskManager killen ...
So, jetzt meine Fragen:
1. ist das ganze theoretisch überhaupt möglich(Hook sendet Daten(aktuelles Fenster-
Handle) an ein anderes Programm)
2. kann ich im Hook abfragen, welche Windows-Message aufgetreten ist(ich möchte ja nicht jeden Tastendruck oder Mausbewegung wissen, nur ob gerade ein anderes Fenster in den Vordergrund geholt wurde)
Über ein paar Tipps wäre ich sehr dankbar!!!!