Autor |
Beitrag |
zakoon
      
Beiträge: 60
|
Verfasst: Mi 28.01.09 02:20
Hallo zusammen,
ich würde gerne herausfinden, ob irgendein Fenster eines bestimmten Prozesses in der Taskleiste "blinkt". Es gibt einige Programm, die das machen um Aufmerksamkeit zu erregen, z.B. Messenger. In der Windows Taskleiste wird der Eintrag des Fensters dann 3 mal kurz "ge-highlighted"
Wie ich die Handles der Unterfenster meines Prozesses bekomme weiß ich schon. Aber nicht wie ich dieses "Blink"-Event registrieren kann.
Über sachdienliche Hinweise freut sich:
Zacharias.
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 28.01.09 05:45
Da fällt mir nur ein die entsprechende Funktionen FlashWindow und FlashWindowEx zu hooken. Ich glaube nicht, dass es eine einfachere Lösung gibt.
|
|
zakoon 
      
Beiträge: 60
|
Verfasst: Mi 28.01.09 11:34
jaenicke hat folgendes geschrieben : | Da fällt mir nur ein die entsprechende Funktionen FlashWindow und FlashWindowEx zu hooken. Ich glaube nicht, dass es eine einfachere Lösung gibt. |
Okay, danke, das deckt sich leider mit den wenigen anderen Hinweisen, die ich gefunden habe
Kennt jemand zufällig ein gutes Tutorial zu Hooks? Habe so etwas bisher noch nicht gebraucht.
Habe jetzt ein Beispiel auf Delphi-Treff gefunden und so angepasst, dass es die Messages an die Fenster abfangen sollte
Jetzt frage ich mich, wie ich herausfinde ob die Flashwindow() die Message ausgelößt hat, und an wie ich das Handle des Fensters bekomme, das "flashed". Oder kann ich irgendwie den Hook nur für einen Prozess setzen?
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49:
| library WindowHook;
uses Windows, Messages;
var HookHandle: Cardinal = 0; WindowHandle: Cardinal = 0;
function WindowHookProc(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall; begin Result := CallNextHookEx(HookHandle, nCode, wParam, lParam); case nCode < 0 of TRUE: exit; FALSE: begin end; end; end;
function InstallHook(Hwnd: Cardinal): Boolean; stdcall; begin Result := False; if HookHandle = 0 then begin HookHandle := SetWindowsHookEx(WH_CALLWNDPROC, @WindowHookProc, HInstance, 0); WindowHandle := Hwnd; Result := TRUE; end; end;
function UninstallHook: Boolean; stdcall; begin Result := UnhookWindowsHookEx(HookHandle); HookHandle := 0; end;
exports InstallHook, UninstallHook; end. |
Laden tue ich die DLL so:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| type TInstallHook = function(Hwnd: THandle): Boolean; stdcall; TUninstallHook = function: Boolean; stdcall;
var InstallHook: TInstallHook; UninstallHook: TUninstallHook; lib: Cardinal;
procedure TForm1.Button1Click(Sender: TObject); begin lib := LoadLibrary('windowhook.dll'); if lib <> INVALID_HANDLE_VALUE then begin InstallHook := GetProcAddress(lib, 'InstallHook'); UnInstallHook := GetProcAddress(lib, 'UninstallHook'); end; end; |
|
|
JayEff
      
Beiträge: 2971
Windows Vista Ultimate
D7 Enterprise
|
Verfasst: Mi 28.01.09 15:07
Laut Assarbad's Hook Tutorial ist der von dir genutzte Hooktyp WH_CALLWNDPROC ein lokaler Hooktyp, d.h. du musst beim einhaken ohnehin die ThreadID des Prozesses in den du dich einhaken willst angeben. Ich kenne mich aber mit Hooks nicht aus und habe keine Ahnung, woher "HInstance" kommt
Ich bin sicher, das Tutorial wird dir aber trotzdem helfen 
_________________ >+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
|
|
zakoon 
      
Beiträge: 60
|
Verfasst: Mi 28.01.09 15:39
|
|
JayEff
      
Beiträge: 2971
Windows Vista Ultimate
D7 Enterprise
|
Verfasst: Mi 28.01.09 15:52
zakoon hat folgendes geschrieben : | Jetzt fehlt mir also noch, wie ich aus den zurückgegebenen Parametern meiner Function WindowHookProc(nCode: Integer; wParam: WPARAM; lParam: LPARAM) ermitteln kann, ob FlashWindow() aufgerufen wurde. Hat jemand dazu eine Idee? |
Ich vermute, dass du diese Information aus den Parametern (wParam, lParam) auslesen kannst - wie genau das geht, weiß ich nicht.
Hierzu steht etwas in diesem MSDN-Eintrag (Gute Anlaufstelle für solche Systemnahen Probleme  Einfach mal dort nach der entsprechenden Konstante suchen.):
Es gibt da diese Struktur CWPRETSTRUCT, in der diverse Informationen darüber stehen, was deinen Hook da angesprochen hat.
_________________ >+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
|
|
zakoon 
      
Beiträge: 60
|
Verfasst: Mi 28.01.09 16:09
|
|
JayEff
      
Beiträge: 2971
Windows Vista Ultimate
D7 Enterprise
|
Verfasst: Mi 28.01.09 16:51
Probiers doch mal aus. Schreib dir ein Programm, welches sein Fenster alle 5 sekunden flasht, dann eines, welches einen WH_CALLWNDPROC auf dieses Fenster setzt. In deiner Callback lässt du dir alle interessanten informationen ausgeben, vorallem den message Parameter. Dieser dürfte eine Zahl sein, welche Message das dann ist, musst du selbst rausfinden.
Sobald du weißt, welche Message das ist, kannst du ja in MSDN konkret nach der Bedeutung der w und lParams suchen.
_________________ >+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
|
|
zakoon 
      
Beiträge: 60
|
Verfasst: Mi 28.01.09 17:45
JayEff hat folgendes geschrieben : | Probiers doch mal aus. Schreib dir ein Programm, welches sein Fenster alle 5 sekunden flasht, dann eines, welches einen WH_CALLWNDPROC auf dieses Fenster setzt. In deiner Callback lässt du dir alle interessanten informationen ausgeben, vorallem den message Parameter. Dieser dürfte eine Zahl sein, welche Message das dann ist, musst du selbst rausfinden.
Sobald du weißt, welche Message das ist, kannst du ja in MSDN konkret nach der Bedeutung der w und lParams suchen. |
Gute Idee  Ich probiers mal aus berichte...
|
|
JayEff
      
Beiträge: 2971
Windows Vista Ultimate
D7 Enterprise
|
Verfasst: Mi 28.01.09 17:56
_________________ >+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
|
|
zakoon 
      
Beiträge: 60
|
Verfasst: Mi 28.01.09 19:04
|
|
JayEff
      
Beiträge: 2971
Windows Vista Ultimate
D7 Enterprise
|
Verfasst: Mi 28.01.09 23:58
OK das war nicht hilfreich  Reichlich enttäuschend. Ich vermute, da muss man noch mehr tun...
OK neuer Ansatz: Nutze die uallCollection, im speziellen die uallHook. Meine Callback-Funktion wird aufgerufen aber ich hab einen Fehler drin: danach kommt eine AV:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24:
| var NextFunc: FlashFunc;
function myCallBack(hWnd : HWND; bInvert : LongBool) : LongBool; begin showmessage('flashed' + IntToStr(hWnd)); result := NextFunc(hWnd, bInvert); end;
procedure TForm1.FormCreate(Sender: TObject); begin HookCode(@FlashWindow, @myCallBack, @NextFunc); end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin UnHookCode(@NextFunc); end;
procedure TForm1.Button1Click(Sender: TObject); begin FlashWindow(self.Handle, false); end; |
_________________ >+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
|
|
|