AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Sendmessage an Dialogfenster

Ein Thema von Nimmersatt · begonnen am 14. Feb 2014 · letzter Beitrag vom 18. Feb 2014
Antwort Antwort
Nimmersatt

Registriert seit: 14. Feb 2014
86 Beiträge
 
#1

Sendmessage an Dialogfenster

  Alt 14. Feb 2014, 16:32
Delphi-Version: 5
Hallo,

Wenn im Programm ein Dialogfenster erscheint, dann will ich per SendMessage ein bestimmtes Button anklicken, um mit dem Programm fortzufahren.

Hier ein Beispiel das nicht funktioniert

Var wndmain,wndchild: hwnd;

begin
MessageDlg('Message',mtConfirmation,[mbYes,mbNo],0); // beliebiges Dialogfenster

wndmain:= GetForegroundWindow; // aktives Fenster ermitteln (das ist dann das Dialogfenster ?)

wndchild:= FindWindowEx( wndmain, 0, nil, ‘ja‘); // Button ermitteln - liegt hier der Fehler ?

sendmessage(wndchild,bm_click,0,0); // Button ‚Ja‘ clicken

//jetzt soll das Programm fortfahren
end;


Mache ich es mir zu einfach ?

Mit Sendmessage beschäftige ich mich erst seit Kurzem, ich bitte also im Voraus meine Verständnisschwierigkeiten zu entschuldigen.
  Mit Zitat antworten Zitat
DelphiProgrammer

Registriert seit: 5. Apr 2013
Ort: Kennste eh net! wer weiss, wer weiss o.o
43 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#2

AW: Sendmessage an Dialogfenster

  Alt 14. Feb 2014, 18:22
Hallo,

Wenn im Programm ein Dialogfenster erscheint, dann will ich per SendMessage ein bestimmtes Button anklicken, um mit dem Programm fortzufahren.

Hier ein Beispiel das nicht funktioniert

Var wndmain,wndchild: hwnd;

begin
MessageDlg('Message',mtConfirmation,[mbYes,mbNo],0); // beliebiges Dialogfenster

wndmain:= GetForegroundWindow; // aktives Fenster ermitteln (das ist dann das Dialogfenster ?)

wndchild:= FindWindowEx( wndmain, 0, nil, ‘ja‘); // Button ermitteln - liegt hier der Fehler ?

sendmessage(wndchild,bm_click,0,0); // Button ‚Ja‘ clicken

//jetzt soll das Programm fortfahren
end;


Mache ich es mir zu einfach ?

Mit Sendmessage beschäftige ich mich erst seit Kurzem, ich bitte also im Voraus meine Verständnisschwierigkeiten zu entschuldigen.
Willst du eine Message ausgeben oder einen Text eingeben und dann mit einem Buttenbestätigen, oder was meinst du mit "bestimmtes Button anklicken"?
Christopher
---------------------------------------------------
I ♥ Delphi
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.273 Beiträge
 
Delphi 12 Athens
 
#3

AW: Sendmessage an Dialogfenster

  Alt 14. Feb 2014, 18:41
Die "Dialoge" von z.B. ShowMessage und MessageDlg sind intern ganz normale TForms, auf denen man wie bekannt, über die entsprechenden VCL-Funktionen auch Buttons suchen und Delphi-Referenz durchsuchenTButton.Clicken kann.


Zitat:
wndmain:= GetForegroundWindow; // aktives Fenster ermitteln (das ist dann das Dialogfenster ?)
Jain?

Nur wenn Dieses auch "aktiv" ist.

Zitat:
wndchild:= FindWindowEx( wndmain, 0, nil, ‘ja‘); // Button ermitteln - liegt hier der Fehler ?
Ja?

Ich bin mit sicher, daß die ‘ falsch sind, was dir mit Sicherheit der Compiler auch gesagt hat.
Und Ja, das 'ja' ist falsch, denn ist die Caption wirklich so? (Vorallem Groß-/Kleinschreibung und inkl. des "&" , für den markieren ShortCut).

Und was fragst du uns, ob da der Fehler ist?
Werte gefälligst selber die Rückgaben der APIs aus. (z.B. FindWindowEx sagt dir ja, ob es was gefunden hat)

bm_click? Warum nicht WM_...?
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (14. Feb 2014 um 18:48 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#4

AW: Sendmessage an Dialogfenster

  Alt 14. Feb 2014, 22:31
MessageDlg() ist eine blockierende Funktion.
Sie kehrt erst dann wieder zum Aufrufer zurück wenn irgend ein Button in dem Dialog geklickt wurde.
Dein Code danach kommt also zu spät weil zu dem Zeitpunkt ist das Dialogfenster schon wieder zerstört.
fork me on Github
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

AW: Sendmessage an Dialogfenster

  Alt 14. Feb 2014, 23:44
@DelphiProgrammer

Der Grund hierfür ist, dass wohl vom Benutzer eine Entscheidung getroffen werden soll.
Wenn der aber innerhalb eines Zeitraums x keine Entscheidung trifft, dann wird eben eine Standardentscheidung angenommen.

"Wollen Sie das Programm wirklich beenden? Ja/Nein" -> nach 10 Sekunden ohne Reaktion des Benutzers wird "Ja" als Entscheidung angenommen und das Programm beendet.

Für genau so einen Fall würde ich einen eigenen Dialog erstellen der analog zum MessageDlg funktioniert (gleiche Parameter + TimeOut, gleiches Aussehen) und über einen Timer den Dialog mit der Default-Antwort zurückliefert.
(evtl. sogar noch mit einer ProgressBar oder halt etwas zum Anzeigen der verstreichenden Zeitspanne)

Delphi-Quellcode:
function MessageDlg(const Msg: string; DlgType: TMsgDlgType; Buttons: TMsgDlgButtons; HelpCtx: Longint; DefaultButton: TMsgDlgBtn; Timeout : Integer): Integer;
begin
  // eigentlich alles aus dem Original kopieren und einen Timer mit einbauen
end;
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.273 Beiträge
 
Delphi 12 Athens
 
#6

AW: Sendmessage an Dialogfenster

  Alt 15. Feb 2014, 00:50
Bei Luckie gab es irgendwo ein, MessageDialogTimeout (oder so) auf der Webseite und einen Post dazu sollte man hier auch irgendwo finden.
[edit] siehe Bei Google suchenMessageBoxTimeout

Und nein, MessageDlg blockiert nicht komplett, denn die MessageLoop läuft brav weiter (Application.ProcessMessages), womit z.B. ein vorher gestarteter Timer dennoch auslösen würde.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (15. Feb 2014 um 00:52 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


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 01:22 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