![]() |
Delphi-Version: 5
Sendmessage an Dialogfenster
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. |
AW: Sendmessage an Dialogfenster
Zitat:
|
AW: Sendmessage an Dialogfenster
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
![]() Zitat:
Nur wenn Dieses auch "aktiv" ist. Zitat:
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_...? |
AW: Sendmessage an Dialogfenster
Delphi-Quellcode:
ist eine blockierende Funktion.
MessageDlg()
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. |
AW: Sendmessage an Dialogfenster
@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; |
AW: Sendmessage an Dialogfenster
Bei Luckie gab es irgendwo ein, MessageDialogTimeout (oder so) auf der Webseite und einen Post dazu sollte man hier auch irgendwo finden.
[edit] siehe ![]() 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. |
AW: Sendmessage an Dialogfenster
Diskussion hin und her...
Sende doch einfach ne Message an den X Button und gut ist. Sollte das gleiche sein als wenn du JA oder OK klicken würdest. Dann musst du auch nicht nach dem Handle des Ja Button suchen. Warum so kompliziert wenn es auch einfach geht.
Delphi-Quellcode:
PostMessage(hwnd, WM_CLOSE, 0, 0);
Sollte eigentlich reichen ist das gleiche als wenn man auf den X Button klickt. gruss |
AW: Sendmessage an Dialogfenster
Zitat:
Ich würde Rufu's tipp beherzigen. Fertige Lösung gibts z.B. hier: ![]() |
AW: Sendmessage an Dialogfenster
Zitat:
Was tut das teil? Nichts anderes als das was ich schon angemerkt habe.
Delphi-Quellcode:
PostMessage(Wnd, WM_CLOSE, 0, 0);
Und wenn ich auf X Klicke und der OK Button hat den Focus dann ist es das gleiche. Man sollte dabei nicht vergessen das der Messageloop eines Dialogs von Windows verwaltet wird. gruss |
AW: Sendmessage an Dialogfenster
Hallo Jungs,
Danke erst mal für die vielen Beiträge, dass es so schnell geht, hätte ich nicht gedacht. Beim Studium eurer Beiträge musste ich feststellen, dass ich mich nicht klar genug ausgedrückt habe. Dafür bitte ich erstmal um Entschuldigung. Zum konkreten Problem Ich habe von meinem Prof den Auftrag, beim Versenden einer Serienmail die Sicherheitsabfrage von Outlook abzuschalten. Er ahnt ja gar nicht, wie sehr er mich da überfordert. Serienmails per Smtp zu schicken geht nicht, zu viele Schwierigkeiten mit dem Rechenzentrum und den Providern. Am Dialogfenster (die Sicherheitsabfrage) kann ich nichts ändern, mein Problem besteht darin, wie ich den Zugriff auf dieses Dialogfenster realisiere. Bei euren Beiträgen habe ich hierzu keine Lösung gefunden, so weit ich das beurteilen kann. Ich hoffe das ich da falsch liege ? Laut Google ist dieses Problem nicht lösbar, was meint ihr ? |
AW: Sendmessage an Dialogfenster
Tante Google lügt nicht :mrgreen:
Es gibt u.U. eine Möglichkeit die Sicherheitswarung auszuschalten, aber mit Sendmessage und Co. wirst Du den Dialog nicht bedienen können, da er in einem anderen (Benutzer-)Kontext läuft. Das sollte Dein Prof aber wissen. |
AW: Sendmessage an Dialogfenster
Zitat:
|
AW: Sendmessage an Dialogfenster
Zitat:
![]() |
AW: Sendmessage an Dialogfenster
Hallo Jänicke,
Danke für die Info, diese werde ich mal testen. Vielleicht funktioniert diese Option ja. Aber vielleicht gibt es ja doch einen Weg, um dieses Problem innerhalb von Delphi zu lösen, wie die zwei Beiträge hoffen lassen. Hallo matsch, soweit ich weiss, kann man das Symbol nicht ausblenden. Du kannst Dir aber sehr einfach ein eigenes ExpressClickYes bauen (Dazu benötigst Du die API-Funktionen FindWindow und SendMessage), bzw. die Funktionalität in direkt in Deine Anwendung integrieren (z.B. in einem Hintergrundthread, der in der Main-methode angestoßen wird). Bei einem eigenen Programm kannst Du selbst bestimmten, ob und falls wie es sichtbar ist, oder nicht. Hallo Rainbird, ich versuche gerade so einen autoatischen "Klick" in mein Programm einzubauen. Es klappt alles auch wunderbar, nur habe ich beim letzten Schritt ein Problem. Der Versuch den Button "Erteilen" zu drücken passiert einfach nichts. Die schritte vorher funktionieren, dh. es ist alles korrekt ausgewählt (Fenster bleibt ja erstmal so stehen). Das vorher ermittelte Button Handle stimmt aber (mit WinSpy überprüft). Hier mal mein Ablauf: hwndCheckbox = Checkbox, die erstmal aktiviert werden muss, um die gewünschte Zeit auswählen zu können hwndCombobox = Combobox mit Zeitangabe hwndButton = Handle des Buttons "Erteilen", welcher den Zugriff erlaubt hWnd = Handle des kleinen Outlook Fensters (Zugriff gewähren?) C#-Code: PostMessage(hWnd, WM_SETFOCUS, 0, 0); PostMessage(hwndCheckbox, WM_SETFOCUS, 0, 0); PostMessage(hwndCheckbox, WM_KEYDOWN, VK_SPACE, 0); PostMessage(hwndCheckbox, WM_KEYUP, VK_SPACE, 0xC0000000); PostMessage(hwndCombobox, WM_KEYDOWN, VK_DOWN, 0); PostMessage(hwndCombobox, WM_KEYUP, VK_DOWN, 0xC0000000); PostMessage(hwndCombobox, WM_KEYDOWN, VK_DOWN, 0); PostMessage(hwndCombobox, WM_KEYUP, VK_DOWN, 0xC0000000); PostMessage(hwndCombobox, WM_KEYDOWN, VK_DOWN, 0); PostMessage(hwndCombobox, WM_KEYUP, VK_DOWN, 0xC0000000); PostMessage(hwndButton, WM_SETFOCUS, 0, 0); PostMessage(hwndButton, WM_KEYDOWN, VK_SPACE, 0); PostMessage(hwndButton, WM_KEYUP, VK_SPACE, 0xC0000000); Ist irgendwas in meinem Ablauf falsch? Ich habe auch schon SendMessage probiert, aber auch damit wird der Button nicht gedrückt. Quelle ![]() |
AW: Sendmessage an Dialogfenster
@Nimmersatt
Sorry auch wenn du neu im Forum bist, oder vielleicht gerade deswegen solltest du dir mal die Formatierungs Möglichkeiten anschauen. Dein Text ist so schwer lesbar. Und das um was es geht wird nicht hervorgehoben. Siehe.. nicht Hallo matsch, sondern den Beitrag als Quote einfügen um was es geht (was du beantworten möchtest) Bei Delphi > C++ Code gibt es ebenfalls Formatierungen in denen du die Quelltexte einbinden kannst. Beispiel: nicht Hallo Jänicke. Sondern Zitat:
Vielleicht funktioniert diese Option ja. Ist doch nicht schwer oder? Nebenbei ohne das ich dir etwas will! Es ist Jaenicke nicht Jänicke gruss |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:27 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