Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Programm beenden über Programm (https://www.delphipraxis.net/5630-programm-beenden-ueber-programm.html)

chris01 13. Jun 2003 19:10


Programm beenden über Programm
 
Hi Leute!!

Ich habe ein Problem, ich würde gerne wissen, wie ich ein Programm über ein anderes ausschalte!! Ich möchte gern ein Programm schreiben das um 0:00 meinen Rechner herunterfährt!! Das klappt ja, bloß wenn ich ein anderes Programm laufen habe, so möchte ich, dass mein Programm dieses erst beendet und dann den Rechner herunterfährt!! Helft mir! :roll:

Bye Chris01!

jbg 13. Jun 2003 21:02

Dann musst du an das Hauptfenster des anderen Programms eine WM_QUIT Botschaft schicken.

chris01 14. Jun 2003 20:06

Wie mache ich dies???

Daniel B 14. Jun 2003 20:10

Hallo,

Suche benutzen und nach SendMessage suchen.

Grüsse, Daniel :hi:

chris01 14. Jun 2003 22:29

Und wie weiß mein Programm, welches es beenden soll, um die Methode SendMessage auszufürhren?

jbg 14. Jun 2003 23:05

Suchfunktion mit EnumWindows bzw. FindWindow.

chris01 17. Jun 2003 16:00

Könntet ihr mir bitte dies mal zeigen!! Ich kann noch nicht so gut Delphi programmieren!!

Christian Seehase 17. Jun 2003 16:15

Moin Chris,

wenn Du Dir die von jbg genannten Beispiele mal rausgesucht hast:

Wo hakt's denn?

chris01 17. Jun 2003 17:32

Ich verstehe es nichT!!!

flomei 17. Jun 2003 18:37

Ist eigentlich ganz einfach:
Du nimmst EnumWindows oder FindWindow um das zu schließende Programm zu finden. Dann sendest du über SendMessage ein WM_QUIT an das Programm und es schließt sich.
Hab zwar keine Ahnung wie man das proggt aber so sollte das gehen.

MfG Florian :hi:

thomasdrewermann 17. Jun 2003 19:28

Hi chris01,
als erstes startest du das von Borland mitgelieferte Tool WinSight32 dort suchst du dir den Klassennamen der Anwendung heraus, die du beenden möchtest. Im nächsten Schritt suchst du das Fenser mit der Anweisung (Funktion) Findwindow. Ist das Handle mit Findwindow ermittelt sendest du die Nachricht zum Schliessen an das Fenster/Programm.

Also so Implementiert:
Delphi-Quellcode:
Sendmessage(Findwindow('Hier dein Klassenname',''),WM_QUIT,0,0);
so müsste es gehn

MFG
Thomas

CalganX 17. Jun 2003 20:01

Klassenname ist, allerdings ziemlich riskant, weil es durchaus zwei Controls mit der selben Klasse geben kann, daher würde ich folgendes eher machen:
Delphi-Quellcode:
SendMessage(FindWindows('ClassName','Beschriftung (Text) des Window'), WM_QUIT, 0, 0);
Just as info: WM_QUIT beendet das Programm "normal". Wenn du WM_SYSCOMMAND nutzen würdest, dann würde das Programm "brutal" beendet werden.

Chris

Christian Seehase 17. Jun 2003 20:01

Moin Chris,

vielleicht hilft das hier ja weiter

Delphi-Quellcode:
// Diese Funktion ist selbst zu deklarieren.
// Wichtig ist die Aufrufkonvention stdcall
function EnumWindowsProc(const hWindow : DWORD;const AdwDummy : DWORD) : Longbool; stdcall;

var
  pCaption : PChar; // Die Adresse eines Buffers, der den jeweiligen Fenstertitel aufnehmen soll
  dwSize  : DWORD; // Bufferlänge

begin
  Result := true; // TRUE = weitermachen

  // Nur sichtbare Fenster prüfen
  if not IsWindowVisible(hWindow) then exit;

  // Ermitteln, wie lang der Text des Fenstertitels ist
  dwSize := SendMessage(hWindow,WM_GETTEXTLENGTH,0,0);

  // Speicher für die auszulesende Caption reservieren + 1, wg. der terminierenden 0
  pCaption := AllocMem(dwSize+1);
  try

    // Fenstertitel auslesen
    // da als zweiter Parameter ein lParam erwartet wird, aber eine Adresse zu
    // übergeben ist, findet hier eine Typumwandlung statt
    SendMessage(hWindow,WM_GETTEXT,dwSize+1,lParam(pCaption));

    // Fenstertitel anzeigen
    // Hier kann dann auch die Prüfung stattfinden, ob das Handle des gesuchten Fensters
    // an diese Funktion übergeben wurde, um damit anzustellen, was auch immer
    // passieren soll.
    // War es das richtige, dann kann man Result auf FALSE setzen, um anzuzeigen,
    // das keine weiteren Fenster durchgegangen werden müssen
    ShowMessage(pCaption);
  finally
    // Speicher wieder freigeben
    FreeMem(pCaption,dwSize+1);
  end;
end;

procedure FindAllWindows;
begin
  // EnumWindows benötigt zum Aufruf nur die Adresse einer Funktion, an
  // die die Fensterhandle aller Top-Level (Haupt-) fenster der Reihe
  // nach wie Windows sie findet übergeben werden.
  EnumWindows(@EnumWindowsProc,0);
end;

procedure TfrmMAIN.Button1Click(Sender: TObject);
begin
  FindAllWindows;
end;

chris01 19. Jun 2003 18:35

Ich weiß aber nicht, was von TerraTec die TV-Software für eine Klasse ist?? Oder Ganz einfache Ordner??


Bye chris01

Luckie 19. Jun 2003 18:41

Wie fährst du denn deinen Rechner runter? EWX_POWEROFF? Pack noch mal EWX_FORCE dazu. Aus der Hilfe:
Zitat:

Forces processes to terminate. When this flag is set, the system does not send the WM_QUERYENDSESSION and WM_ENDSESSION messages. This can cause the applications to lose data. Therefore, you should only use this flag in an emergency.

chris01 19. Jun 2003 18:52

Über Start -> Beenden!!(Witz)

Hier im Forum unter Code-Library steht eine Funktion dafür!! Diese wollte ich benutzen!! Oder gibt es bessere als diese unter WinXp??

Bye chris01

Luckie 19. Jun 2003 19:08

Psote mal Link, bin zu faul zum Suchen. Aber wenn es die ist, beid er man sich die Rechte vorherholt, dann ist es die richtige und es gibt keine bessere. Häng einfach mit or noch das EWX_FORCE an das Flag dran und probier dann mal.

Luckie wünscht viel Spaß beim Rebooten des Rechners.

chris01 19. Jun 2003 19:15

Ich hoffe das ist der richtige!! Habe ich einfach aus der Adressleiste kopiert

-> Klicke hier <-

bye chris01

Luckie 19. Jun 2003 19:47

ja, aber dien Zusatz von Daniel berücksichtigen. Undwarum probierst du es nicht endlich mal aus? :roll:

chris01 26. Jun 2003 12:56

HI leute!!

Ich habe es probiert zu testen, doch ich kann mit WS32.exe nicht umgehen!! Alle meine Programme haben den Classname ComboLBox!! Oder Afx:2............!! Gibt es da eine dynamische Funktion zum heraus finden der classnames?? Oder unter welchen stichpunkt muss ich suchen, für die class!!

Bye chris01

Luckie 26. Jun 2003 13:06

Probier es mal mit meinem Programm "WindowInfo", zu finden auf meiner Seite. Einfach die Zielscheibe nehmen und über das betreffende Fenster fahren.

chris01 27. Jun 2003 18:47

Es geht immer noch nicht!! Ich glaube, es liegt an mir!! Das Programm WindowInfo zeigt bei der Anwendung nichts an!! Außer Static, Button, VideoRenderer!! Und welche Klasse ist das jetzt?? Könnt ihr mir bitte irgendwie helfen!!

Ich schaffe es nie allein!!

Luckie 27. Jun 2003 22:58

So zeigt nichts an? Außer Static, Button, VideoRenderer? Das sind die Fensterklassen.

chris01 28. Jun 2003 14:54

Ja die habe ich dann in die Funktion gegesetzt und es funktioniert nicht!!

Sendmessage(Findwindow('VideoRenderer','Cinergy Live'),WM_QUIT,0,0);

Muss ich vielleicht erst die erlaubnis von Windows haben? Und wenn, wie mache ich das?? Oder wisst ihr vielleicht eine andere Lösung??

Bye

Christian Seehase 28. Jun 2003 15:16

Moin Chris,

ich würd' das FindWindow mal separat aufrufen, und prüften, ob das Fenster auch gefunden wurde.
Vielleicht klappt das ja nicht.

chris01 28. Jun 2003 15:48

Welchen Wert liefert mir den FindWindow??

Christian Seehase 28. Jun 2003 16:00

Moin Chris,

Zitat:

Zitat von chris01
Welchen Wert liefert mir den FindWindow??

:shock:

Das Handle des Fensters dessen Klassennamen und/oder Caption Du angegeben hast.

Vielleicht solltest Du Dich bei Gelegenheit auch mal mit der Doku zu den Funktionen beschäftigen, damit die Zusammenhänge klarer werden.

chris01 11. Jul 2003 14:55

Re: Programm beenden über Programm
 
Ich habe es immer noch nicht hin bekommen!! Der findet mir das Fenster, aber wenn ich dann die WM_QUIT sende, beendet er mir es nicht!! Kann man vielleicht auch Programme über Programm namen beenden?? Z.b. winword.exe oder editor.exe??

Wenn ja, wie??

Bye chris01

Gast 11. Jul 2003 15:35

Re: Programm beenden über Programm
 
Erfahren kannst du das (i.e. Name der Fensterklasse) mit EDA, X-Spy oder mit Spy und Spy++ aus dem PSDK bzw Visual Studio.

Gast 11. Jul 2003 15:36

Re: Programm beenden über Programm
 
Kannst den Prozess killen. Aber die Methode ist OS-abhaengig!

chris01 17. Jul 2003 13:43

Re: Programm beenden über Programm
 
@Assarbad

Nicht wirklich!!

Gast 17. Jul 2003 14:39

Re: Programm beenden über Programm
 
doch. der beispiele gibt es viele. zB mein PView2! siehe meine homepage

Blizzard 17. Jul 2003 15:24

Re: Programm beenden über Programm
 
@chris probier es mal noch mit postmessage anstatt sendmessage so ein ähnliches problem trat nämlich auch in diesem thread und da hat es mit postmessage statt sendmessage dann geklappt.

chris01 30. Jul 2003 15:05

Re: Programm beenden über Programm
 
Die eigene Anwendung funktioniert, doch bei den anderen nicht!! Brauche ich vielleicht die Rechte von WinXP dafür??

Luckie 19. Dez 2003 22:45

Re: Programm beenden über Programm
 
Kuck doch erstmal, ob du überhaupt das Fenster mit FindWindow findest. Sprich lass dir mal anzeigen, was FinWindow zurück gibt. Dann können wir weitersehen. Gib auch erstmal nur den fenstertitel an.

Robert_G 20. Dez 2003 01:25

Re: Programm beenden über Programm
 
@Lucky
Ich glaube nach einem halben Jahr hat er den Rechner "manuell" heruntergefahren :lol:

Luckie 20. Dez 2003 02:14

Re: Programm beenden über Programm
 
Er hatte mich eben noch mal angesprochen.

TStringlist 20. Dez 2003 15:23

Re: Programm beenden über Programm
 
...wahrscheinlich lags/liegts tatsächlich an FindWindow. Das sehe ich hier in dem Thread nämlich immer mit etwas falschen Parametern bestückt. Weil nämlich, normale Strings sollten da eigentlich nicht stehen, sondern eher Pointer auf nullterminierte Strings. Also folgendes funktionierte bei mir z.B.:


Code:
var
  WindowHandle : HWnd;
begin
  WindowHandle := FindWindow(PChar(0), PChar('Testprog'));
  if WindowHandle <> 0 then PostMessage(WindowHandle,WM_Quit,0,0);
  ...

Luckie 20. Dez 2003 15:24

Re: Programm beenden über Programm
 
Der Cast nach PChar ist nur nötig, wenn eine Variable dort steht. Steht dort ein hardgecodeter String, erledigt das die Compilermagic von Delphi für dich.

TStringlist 20. Dez 2003 16:58

Re: Programm beenden über Programm
 
...hm, also mit

WindowHandle := FindWindow('', 'Testprog');

funktioniert es bei mir aber nicht, da bekomme ich für WindowHandle nämlich immer die 0 zurück.

Wenn ich allerdings folgendes schreibe:

WindowHandle := FindWindow(PChar(0), 'Testprog');

dann geht's auf einmal doch. Du hast also (wenigstens teilweise) durchaus recht. Bei einem leeren String ('') jedoch, scheint diese Compilermagic dann aber irgendwie nicht mitzuspielen. Ergo: Da bei FindWindow aber fast immer ein leerer String als Parameter mit von der Partie ist, ist es also schon etwas besser, sich lieber gleich in beiden Fällen des PChar's zu bedienen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:09 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz