Entwickler-Ecke

Windows API - handel auf fremde anwendungen


farbdoc - Di 13.08.02 09:32
Titel: handel auf fremde anwendungen
Hi Leute.

Kann mir jemand erklären, wie ich ein handle auf eine andere anwendung bekomme (speziell deren fenster) und wie ich dann bestimmte messages an das porg schicken kann?

Ich möchte ein prog schreiben,
welches z.b. guckt ob ein fenster der notepad.exe existiert/offen ist,
sich ein handle auf das notepad fenster besorgt und dann das notepad fenster versteckt.
Wenn das notepad fenster schon versteckt ist, soll das prog die show message an notepad schicken, also es soll die sichtbarkeit toggeln...

Als denn... :D der farbdoc


toms - Di 13.08.02 10:22

Hi,

Mit FindWindow() kannst du nach einem Fenster suchen und
bekommst dann ein Handle darauf zurück.
IsWindowVisible() überprüft, ob ein Fenster sichtbar ist.
Mit ShowWindow() kannst du ein Fenster verstecken, anzeigen usw.


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure TForm1.Button1Click(Sender: TObject);
var
  wnd : HWND;
begin
  // Notepad suchen
  wnd := FindWindow('notepad',nil);
  // überprüfen, ob Handle gültig ist
  if IsWindow(wnd) then
    // dann die sichtbarkeit toggeln
    ShowWindow(wnd, Ord(not IsWindowVisible(wnd)));
end;


tom


farbdoc - Di 13.08.02 10:56
Titel: funzt bestens!
alles klar tom!

danke - das WAR mein problem :lol: !


SpeedyGTD - Di 13.08.02 15:40

Bei mir funktioniert es auch ganz gut, bis auf Explorer, IExplorer, Rechner usw, wie geht es bei denen. :(

Mfg SpeedyGTD :D


DeCodeGuru - Di 13.08.02 16:42

Zum IExplorer: probiers mal mit IEFrame.


Delete - Di 13.08.02 16:56

Windows-Explorer = ExploreWClass

Einfach mal ein Programm benutzen, dass die Fenster (deren Titel und Klassen) auflistet. Kann man notfalls mit einer einfachen "EnumWindows"-Funktion selbst programmieren - wenn´s nicht noch unbedingt die Prozesse und Threads sein müssen.


SpeedyGTD - Mi 14.08.02 00:05

Vielen Dank @ DeCodeGuru das mit IEFrame ging wunderbar :D

Vielen Dank auch an MathiasS. das mit ExploreWClass ging leider nicht, aber könntest du mir vieleicht sagen, wo ich ein Prog finde was die Titel und Klassen auflistet, am besten auch eins das mir auch die Threads und Prozesse auflistet. :lol:


Delete - Mi 14.08.02 12:09

Also ein Fensterauflister ist schnell gemacht. Folgendes Beispiel demonstriert, wie -via Buttonklick- alle Hauptfenster, die sichtbar sind oder ein Systemmenü haben, minimiert werden:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
function CloseAll(Wnd: hWnd; lparam: LPARAM): longbool; stdcall;
begin
  if((GetWindowLong(Wnd,GWL_STYLE) and (WS_VISIBLE or WS_SYSMENU)) = (WS_VISIBLE or WS_SYSMENU)) then
    PostMessage(Wnd,WM_SYSCOMMAND,lParam,0);

  Result := true;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  EnumWindows(@CloseAll,SC_MINIMIZE);
end;

Wer statt SC_MINIMIZE mal SC_CLOSE eingibt, kriegt auch offene Explorer zu. :wink:

So, wenn du dir jetzt mal die Funktion "CloseAll" anguckst, dann siehst du, dass dort eine HWND-Variable vorhanden ist. Wenn du die if-Abfrage und das PostMessage weglässt könntest du z.B. mit

Quelltext
1:
2:
GetClassName
GetWindowText

den Klassennamen und den Fenstertitel auslesen und an eine ListBox usw. weiterreichen. Achtung: Nicht jedes Fenster liefert einen Fenstertitel zurück.

Für Prozesse und Threads musst du andere Methoden benutzen. Da gibt´s aber einige Delphi-Demos. Musst einfach mal ´ne Suchmaschine wie Google bemühen, da sollte was zu finden sein.