![]() |
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! |
Dann musst du an das Hauptfenster des anderen Programms eine WM_QUIT Botschaft schicken.
|
Wie mache ich dies???
|
Hallo,
Suche benutzen und nach SendMessage suchen. Grüsse, Daniel :hi: |
Und wie weiß mein Programm, welches es beenden soll, um die Methode SendMessage auszufürhren?
|
Suchfunktion mit EnumWindows bzw. FindWindow.
|
Könntet ihr mir bitte dies mal zeigen!! Ich kann noch nicht so gut Delphi programmieren!!
|
Moin Chris,
wenn Du Dir die von jbg genannten Beispiele mal rausgesucht hast: Wo hakt's denn? |
Ich verstehe es nichT!!!
|
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: |
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:
so müsste es gehn
Sendmessage(Findwindow('Hier dein Klassenname',''),WM_QUIT,0,0);
MFG Thomas |
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:
Just as info: WM_QUIT beendet das Programm "normal". Wenn du WM_SYSCOMMAND nutzen würdest, dann würde das Programm "brutal" beendet werden.
SendMessage(FindWindows('ClassName','Beschriftung (Text) des Window'), WM_QUIT, 0, 0);
Chris |
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; |
Ich weiß aber nicht, was von TerraTec die TV-Software für eine Klasse ist?? Oder Ganz einfache Ordner??
Bye chris01 |
Wie fährst du denn deinen Rechner runter? EWX_POWEROFF? Pack noch mal EWX_FORCE dazu. Aus der Hilfe:
Zitat:
|
Ü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 |
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. |
Ich hoffe das ist der richtige!! Habe ich einfach aus der Adressleiste kopiert
![]() bye chris01 |
ja, aber dien Zusatz von Daniel berücksichtigen. Undwarum probierst du es nicht endlich mal aus? :roll:
|
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 |
Probier es mal mit meinem Programm "WindowInfo", zu finden auf meiner Seite. Einfach die Zielscheibe nehmen und über das betreffende Fenster fahren.
|
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!! |
So zeigt nichts an? Außer Static, Button, VideoRenderer? Das sind die Fensterklassen.
|
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 |
Moin Chris,
ich würd' das FindWindow mal separat aufrufen, und prüften, ob das Fenster auch gefunden wurde. Vielleicht klappt das ja nicht. |
Welchen Wert liefert mir den FindWindow??
|
Moin Chris,
Zitat:
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. |
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 |
Re: Programm beenden über Programm
|
Re: Programm beenden über Programm
Kannst den Prozess killen. Aber die Methode ist OS-abhaengig!
|
Re: Programm beenden über Programm
@Assarbad
Nicht wirklich!! |
Re: Programm beenden über Programm
doch. der beispiele gibt es viele. zB mein PView2! siehe meine homepage
|
Re: Programm beenden über Programm
@chris probier es mal noch mit postmessage anstatt sendmessage so ein ähnliches problem trat nämlich auch in diesem
![]() |
Re: Programm beenden über Programm
Die eigene Anwendung funktioniert, doch bei den anderen nicht!! Brauche ich vielleicht die Rechte von WinXP dafür??
|
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.
|
Re: Programm beenden über Programm
@Lucky
Ich glaube nach einem halben Jahr hat er den Rechner "manuell" heruntergefahren :lol: |
Re: Programm beenden über Programm
Er hatte mich eben noch mal angesprochen.
|
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); ... |
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.
|
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. |
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