![]() |
SendMessage wartet nicht
Hallo zusammen!
Im MSDN steht: Zitat:
Pseudo Code:
Code:
Warum wartet SendMessage nicht? Habs auch mit SendMessageTimeout versucht bei gleichem Ergebnis
Prozess 1:
Result:=SendMessage(RemoteWnd, WM_IPC_SHOWFORM, 0, 0); // Hier gehts mit Result=0 kurz drauf weiter, obwohl Form2 noch nicht geschlossen wurde. Prozess 2: procedure TForm1.WndProc(var Message:TMessage); begin Case Message.Msg of ... WM_IPC_SHOWFORM: begin Message.Result:=Form2.ShowModal; Exit; <- Hier gehts erst weiter sobald Form2 geschlossen wurde end; end; ... end; |
AW: SendMessage wartet nicht
Nimm mal
Delphi-Quellcode:
statt 0 für das Timeout, dann gehts auch :-D Oder halt direkt
INFINITE
![]() Hatte den letzten Satz überlesen. Verwendest du noch Win2000? MSDN sagt, dass ![]()
Delphi-Quellcode:
enthalten sollte:
ERROR_TIMEOUT
Zitat:
|
AW: SendMessage wartet nicht
Dumme Idee:
Delphi-Quellcode:
verursacht selber wieder das Senden und Abarbeiten von Messages. Ob der deine Message irgendwie runternimmt, damit nichts anfangen kann und wegwirft? Ich würde es mal nicht an TForm1 binden, sondern generell mit
ShowModal()
Delphi-Quellcode:
oder wie das hieß...
Application.RegisterWndProc(..)
Mit dem "SendMessageTimeout" komme ich nicht klar: Die beiden Nullen sind eigentlich WPARAM und LPARAM. Kommt das "Timeout" nur von einem Test? Denn für "SendMessageTimeout" hat der Aufruf zu wenig Parameter... |
AW: SendMessage wartet nicht
Zitat:
![]() ![]() |
AW: SendMessage wartet nicht
Ist ja auch ganz logisch. ShowModal blockiert solange bis dasn Fenster geschlossen wird. Das hat nichts mit SendMessage zu tun.
Dementsprechend kommt er zu dem exit logischerweise auch erst wenn das Fenster geschlossen wurde. Das andere Programm kriegt wohl vorzeitig eine 0 zurück (Timeout) weil es ansonsten solange hängen würde bis das Fenster wieder geschlossen wird. Unterm Strich heißt das: ShowModal im WndProc ist keine gute Idee. |
AW: SendMessage wartet nicht
Dann wäre aber die Beschreibung im MSDN falsch.
Auch ein SendMessageTimeOut mit ner Zeit gegeben von einer Stunde wartet nicht solange. |
AW: SendMessage wartet nicht
Kontrollierst du bitte nochmal deinen Quellcode? SendMessageTimeout(..) hat nicht vier Parameter, sondern mehr.
|
AW: SendMessage wartet nicht
Zitat:
|
AW: SendMessage wartet nicht
Zitat:
|
AW: SendMessage wartet nicht
Ok nochmal von vorne :-D Ein Result von 0 bei
![]() ![]() ![]() Das Problem hat Günther schon korrekt erkannt:
Delphi-Quellcode:
startet eine eigene Message-Verarbeitung und sorgt deshalb dafür, dass deine eigene Message vom Default Message-Handler abgearbeitet und aus der Queue entfernt wird. Das ist dann der Moment, in dem
ShowModal
![]() |
AW: SendMessage wartet nicht
ShowModal läuft in der 2. Anwendung, was hat das mit dem Blocken in der 1. Anwendung zu tun? Oder verstehe ich da was falsch?
|
AW: SendMessage wartet nicht
Ich dachte die 1. Anwendung wird nicht geblockt, heißt: Du bekommst einen Rückgabewert obwohl das mit ShowModal() geöffnete Fenster noch offen ist.
Die Erklärung war dass der ShowModal()-Aufruf der Form2 selbst anfängt Nachrichten zu verarbeiten. Dem hast du deinen eigene Nachricht nicht beigebracht. Er wirft sie weg und beantwortet sie mit Null. Versuche es doch mal so:
Delphi-Quellcode:
// TWindowHook = function (var Message: TMessage): Boolean of object;
function TForm1.handleIpcShowForm(var Message: TMessage): Boolean; const WM_IPC_SHOWFORM = WM_USER + 1; var secondForm: TForm; begin case Message.Msg of WM_IPC_SHOWFORM: begin secondForm := TForm.Create(nil); try Message.Result := secondForm.ShowModal(); Result := True; finally secondForm.Destroy(); end; end; else Result := False; end; end; procedure TForm1.FormCreate(Sender: TObject); begin Application.HookMainWindow(handleIpcShowForm); end; |
AW: SendMessage wartet nicht
Hallo,
warum gehst du überhaupt über Messages? Das sind Kanonen auf die armen Spatzen. |
AW: SendMessage wartet nicht
Weil er zwei verschiedene Prozesse hat. Ich bin für IPC-Sachen kein Profi, aber für so etwas einfaches wie "Mache ein Fenster auf" hätte ich das wahrscheinlich auch genommen...
|
AW: SendMessage wartet nicht
Zitat:
Delphi-Quellcode:
der Fall ist. Da
ShowModal
Delphi-Quellcode:
die Message aber selbstständig abarbeitet, hört
ShowModal
![]()
Delphi-Quellcode:
Aufruf auf zu blockieren.
ShowModal
|
AW: SendMessage wartet nicht
Wenn ich also anstatt ein Formular mit ShowModal anzuzeigen eine MessageBox aufrufe funktioniert es, was macht Windows da anders?
|
AW: SendMessage wartet nicht
Eine Windows-Messagebox ist keine VCL-Anwendung? Hast du die Beiträge hier drüber überhaupt gelesen? :oops:
|
AW: SendMessage wartet nicht
Ja ich habe die Beiträge gelesen und bin deswegen vom ShowModal weggegangen und es würde mich weiterhin interessieren, wie Windows sein Modales Fenster realisieren kann ohne den SendMessage Block zu stören. Das Windows nicht Delphi VCL ist bin ich mir ebenfalls bewusst, daher ja der Gedanke, ob ich die Windows Variante nachahmen kann.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:28 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