Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Prozess ohne Nachfrage beenden (https://www.delphipraxis.net/125642-prozess-ohne-nachfrage-beenden.html)

stockholm 9. Dez 2008 13:31


Prozess ohne Nachfrage beenden
 
Hallo,

ich habe nun gefühlte 10.000 Lösungen und Thread gelesen, die leider ALLE auf TerminateThread aufbauen. Dumm ist leider, dass das Programm, welches ich beenden möchte, darauf nur mit einem "Möchten Sie das Programm wirklich schließen?" antwortet.

Also, gibt es einen -einfachen- weg, das Programm zu schließen?

Handle bekannt.

Danke

Luckie 9. Dez 2008 13:42

Re: Prozess ohne Nachfrage beenden
 
Wenn du den Prozess mit MSDN-Library durchsuchenterminateProcess beendest, dann fragt das Programm unter Garantie nicht mehr nach, weil es das gar nicht mehr kann. Nach einem Genickschuss, sagst du nämlich auch nichts mehr.

stockholm 9. Dez 2008 13:44

Re: Prozess ohne Nachfrage beenden
 
Zitat:

Zitat von Luckie
Wenn du den Prozess mit MSDN-Library durchsuchenterminateProcess beendest, dann fragt das Programm unter Garantie nicht mehr nach, weil es das gar nicht. Nach einem Genickschuss, sagst du nämlich auch nichts mehr.

Ich ich da nun seit gut 2 Stunden dran und nahe einer Explosion ;)

Delphi-Quellcode:
procedure KillProcess(hWindowHandle: HWND);
var
  hprocessID: INTEGER;
  processHandle: THandle;
  DWResult: DWORD;
begin
  SendMessageTimeout(hWindowHandle, WM_CLOSE, 0, 0,
    SMTO_ABORTIFHUNG or SMTO_NORMAL, 5000, DWResult);
  if isWindow(hWindowHandle) then
  begin
    { Get the process identifier for the window}
    GetWindowThreadProcessID(hWindowHandle, @hprocessID);
    if hprocessID <> 0 then
    begin
      { Get the process handle }
      processHandle := OpenProcess(PROCESS_TERMINATE or PROCESS_QUERY_INFORMATION,
        False, hprocessID);
      if processHandle <> 0 then
      begin
        { Terminate the process }
        TerminateProcess(processHandle, 0);
        CloseHandle(ProcessHandle);
      end;
    end;
  end;
end;
Diese Funktion greift auf TerminateProcess zurück, right?

Und das Programm antwortet mit... "Möchten Sie das Programm wirklich schließen?"...

ToFaceTeKilla 9. Dez 2008 13:52

Re: Prozess ohne Nachfrage beenden
 
Vielleicht nützt dir ja das hier was ^^
klick (man beachte das Michael selbst von der Benutzung abrät)

oder das, da gehts zwar um Dienste, aber vielleicht kann man das ja anderweitig benutzen (siehe #12 in dem Thread)

Luckie 9. Dez 2008 14:00

Re: Prozess ohne Nachfrage beenden
 
Zitat:

Zitat von stockholm
Diese Funktion greift auf TerminateProcess zurück, right?

Nein:
Delphi-Quellcode:
SendMessageTimeout(hWindowHandle, WM_CLOSE, 0, 0, SMTO_ABORTIFHUNG or SMTO_NORMAL, 5000, DWResult);
Es wird erst versucht das Fenster des Prozesses "normal" zu schliessen. Und das löst natürlich bei manchen Fenstern eine Nachfrage aus.

stockholm 9. Dez 2008 14:27

Re: Prozess ohne Nachfrage beenden
 
Danke.
Danke, Danke Danke.

amigage 10. Aug 2009 09:15

Re: Prozess ohne Nachfrage beenden
 
Hallo,

ich bin gerade dabei, meine Projekte auf D2009 umzustellen.
Hierbei habe ich Probleme mit der Windows Funktion SendMessageTimeout . :(

Delphi-Quellcode:
function foo : Boolean;
var
  wnd: HWND;
  DWResult: DWORD;
begin
    wnd := FindWindow('irgend ein Windowname',NIL);
    if wnd <> 0 then
      if SendMessageTimeout(Wnd, WM_Close, 0, 0, SMTO_NORMAL, 3000, DWResult) = 0 then
        // .....
end;
Bisher hat dieser Aufruf immer funktioniert. Jetzt meckert der Compiler:
Zitat:

"Die Typen der tatsächlichen und formalen Var-Parameter müssen übereinstimmen"
Die Erklärung in der Hilfe lautet:

Zitat:

SendMessageTimeout Function
--------------------------------------------------------------------------------
Sends the specified message to one of more windows.

Syntax

LRESULT SendMessageTimeout( HWND hWnd,
UINT Msg,
WPARAM wParam,
LPARAM lParam,
UINT fuFlags,
UINT uTimeout,
PDWORD_PTR lpdwResult
);
Ich scheine etwas zu übersehen, aber was? Wäre über jede Hilfe dankbar.

alf.stefan 11. Aug 2009 14:08

Re: Prozess ohne Nachfrage beenden
 
ist der letzte Parameter nicht ein pointer?

hast Du es schon so versucht?

Delphi-Quellcode:
 if SendMessageTimeout(Wnd, WM_Close, 0, 0, SMTO_NORMAL, 3000, @DWResult) = 0 then


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:42 Uhr.

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