Autor Beitrag
farbdoc
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Di 13.08.02 09:32 
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1099
Erhaltene Danke: 2



BeitragVerfasst: 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.

ausblenden 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 Threadstarter
Hält's aus hier
Beiträge: 5



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

danke - das WAR mein problem :lol: !
SpeedyGTD
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 89



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1333
Erhaltene Danke: 1

Arch Linux
Eclipse
BeitragVerfasst: Di 13.08.02 16:42 
Zum IExplorer: probiers mal mit IEFrame.

_________________
Viele Grüße
Jakob
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 89



BeitragVerfasst: 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:
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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:
ausblenden 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
ausblenden 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.