AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Fremde Anwendung (+ Message Box Dialog) "sanft" beenden
Thema durchsuchen
Ansicht
Themen-Optionen

Fremde Anwendung (+ Message Box Dialog) "sanft" beenden

Ein Thema von Thomas233 · begonnen am 27. Mär 2007 · letzter Beitrag vom 2. Apr 2007
Antwort Antwort
Seite 1 von 2  1 2      
Thomas233

Registriert seit: 20. Feb 2004
Ort: Villach
66 Beiträge
 
Delphi 2005 Personal
 
#1

Fremde Anwendung (+ Message Box Dialog) "sanft" be

  Alt 27. Mär 2007, 14:04
Hi,

ich habe ein Problem mit einer fremden Anwendung die ich schliessen will. Leider konnte ich weder in diesem Forum noch bei Google einen Lösungsweg finden.

Problemstellung:
Ein fremdes Programm soll durch mein Programm "sanft" (d.h. kein unsanftes terminieren des Prozesses bzw. vermeiden eines Datenverlustes beim Beenden wg. kritischer Daten) beendet werden.

Bisheriger Stand:
Ich hole mir das Win32-Handle des entsprechenden Programmfensters und schicke dem fremden Programm mit meinem Programm eine WM_CLOSE-Nachricht per Winapi-Befehl SendMessage().
Das Programm reagiert auch darauf, jedoch mit einer Sicherheitsabfrage ob es wirklich geschlossen werden soll (eine Messagebox).

Das Problem:
Diese Sicherheitsabfrage blockiert nun das gesamte Programm welches beendet werden soll. Leider hat die Messagebox natürlich kein Handle sodass ich keine WM_CLOSE Nachricht daran schicken kann. Ausserdem habe ich schon versucht einen Enter-Tastendruck zu simulieren per SendInput() welcher die Messagebox eigentlich (zumindest wenn man es manuell macht) mit "Ja" beantworten müsste. Desweiteren habe ich dem Programm eine weitere WM_CLOSE Nachricht geschickt und gehofft, hat jedoch auch nicht geholfen.

Würde mich über einen Tipp sehr freuen !

Danke !

Mfg.
Thomas Tschofenig
  Mit Zitat antworten Zitat
Benutzerbild von RavenIV
RavenIV

Registriert seit: 12. Jan 2005
Ort: Waldshut-Tiengen
2.875 Beiträge
 
Delphi 2007 Enterprise
 
#2

Re: Fremde Anwendung (+ Message Box Dialog) "sanft"

  Alt 27. Mär 2007, 14:10
Such mal hier im Forum nach "Taste senden" oder "tastendruck simulieren" oder so ähnlich.
Damit kann man einer Anwendung einen Tastendruck rüberbeamen.
Klaus E.
Linux - das längste Text-Adventure aller Zeiten...
Wer nie Linux mit dem vi konfiguriert hat, der hat am Leben vorbei geklickt.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#3

Re: Fremde Anwendung (+ Message Box Dialog) "sanft"

  Alt 27. Mär 2007, 14:13
Versuchs mal mit der API GetForegroundWindow
entweder bekommst ein Handle der Messagebox oder nicht!.

Alternativ dazu

Zitat:
GetActiveWindow
GetForegroundWindow
GetFocus
GetTopWindow(GetFocus)
musst halt versuchen ..


Man kann immer versuchen, per Sendkeys ein Alternate F4 zu schicken.
Das Fenster muss natuerlich vorher aktiviert werden. Die meisten Fenster (incl. Messageboxen) reagieren darauf.

gruss
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#4

Re: Fremde Anwendung (+ Message Box Dialog) "sanft"

  Alt 27. Mär 2007, 15:20
es ist eine MessageBox die kein Handle hat? Kannst du einen Screenshot davon zeigen? wenn es eine Messagebox ist gibt es auf jeden fall auch ein Handle.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#5

Re: Fremde Anwendung (+ Message Box Dialog) "sanft"

  Alt 27. Mär 2007, 15:47
Zitat von SirThornberry:
es ist eine MessageBox die kein Handle hat? Kannst du einen Screenshot davon zeigen? wenn es eine Messagebox ist gibt es auf jeden fall auch ein Handle.
Nein nicht unbedingt!
Bei Office zum beispiel werden die Messageboxen gezeichnet bzw... sind Bilder
Daher gibt es da auch kein Handle da es keine Fenster gibt.

gruss Emil
  Mit Zitat antworten Zitat
LizardKaiser

Registriert seit: 18. Feb 2007
Ort: Kassel
25 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: Fremde Anwendung (+ Message Box Dialog) "sanft"

  Alt 27. Mär 2007, 15:51
hast du das mal mit Spy++ überprüft?
  Mit Zitat antworten Zitat
Thomas233

Registriert seit: 20. Feb 2004
Ort: Villach
66 Beiträge
 
Delphi 2005 Personal
 
#7

Re: Fremde Anwendung (+ Message Box Dialog) "sanft"

  Alt 27. Mär 2007, 16:57
Soviel ich bisher gelesen habe ist es nicht möglich eine Messagebox per Handle und WM_CLOSE zu schliessen da diese für Windows Dialoge ohne Handle bzw. Dialoge die zu einem anderen Handle gehören darstellen (intern dürften sie natürlich auch ein eigenes Handle haben, da kommt man aber sicher nicht ran).

Hier mein Versuch eines Tastendruckes:

Delphi-Quellcode:
procedure CloseAppFromInst(HInst: THandle);
var
  Inp: TInput;
  I: Integer;
begin
  //Fenster fokussieren
  PostMessage(HInst, WM_ACTIVATEAPP, 0, 0);
  PostMessage(HInst, WM_SHOWWINDOW, 0, 0);

  //Schliessen Nachricht
  PostMessage(HInst, WM_CLOSE, 0, 0);

  Inp.Itype := INPUT_KEYBOARD;
  Inp.ki.wVk := VK_RETURN;
  Inp.ki.dwFlags := 0;
  SendInput(1, Inp, SizeOf(Inp));

  keybd_event(VK_RETURN,0,0,0);
end;
Habs auch schon mit SendInput() versucht, kam aber auch nichts dabei heraus !
Miniaturansicht angehängter Grafiken
scrn_msg_242.jpg  
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#8

Re: Fremde Anwendung (+ Message Box Dialog) "sanft"

  Alt 27. Mär 2007, 17:28
Meine Vorschläge mal überdacht?
Schick doch einfach mal ein F4 an die Messagebox
nachdem du sie in den Vordergrund und Focustiert hast.

Eigentlich müßte dann da der OK Button den Focus hat der Dialog schließen.
Frage mich auch warum du das Handle vom process holst.

Das liefert dir die API GetForegroundWindow .. Quasi das Handle der MessageBox

gruss
  Mit Zitat antworten Zitat
LizardKaiser

Registriert seit: 18. Feb 2007
Ort: Kassel
25 Beiträge
 
Delphi 7 Enterprise
 
#9

Re: Fremde Anwendung (+ Message Box Dialog) "sanft"

  Alt 27. Mär 2007, 17:33
wieso denn nicht

- hDlg := FindWindow('#32770', 'titel der msgBox');
- if handle der fremden anwendung == GetParent(hDlg):
- hBtn = FindWindow('Button', 'OK');
- SendMessage(hBtn, BM_CLICK, 0, 0)

ohne gewähr und pseudiger pseudocode, vllt. klappts ja (bei BM_CLICK bin ich mir allerdings nicht so sicher)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#10

Re: Fremde Anwendung (+ Message Box Dialog) "sanft"

  Alt 27. Mär 2007, 17:38
Zitat von LizardKaiser:
wieso denn nicht

- hDlg := FindWindow('#32770', 'titel der msgBox');
- if handle der fremden anwendung == GetParent(hDlg):
- hBtn = FindWindow('Button', 'OK');
- SendMessage(hBtn, BM_CLICK, 0, 0)

ohne gewähr und pseudiger pseudocode, vllt. klappts ja (bei BM_CLICK bin ich mir allerdings nicht so sicher)
hmm kapier das nicht!
warum so umständlich wenn wie schon erklärt GetForegroundWindow das Handle liefert
ohne FindWindow , GetwindowText und.. und.. und.


Zitat:
1. GetForegroundWindow
Diese Funktion ermittelt den Fensterhandle des Fensters welches sich im Vordergrund (am Anfang der Z-Order) befindet.
Zitat:
2. GetFocus
Diese Funktion ermittelt den Fensterhandle des Fensters welches im aktuellen Thread den Focus besitzt.
Zitat:
3. GetTopWindow
Diese Funktion ermittelt den Fensterhandle des Kindfensters welches den Focus besitzt oder sich im Vordergrund befindet.
gruss
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:04 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