| 

.NET C# Java Javascript Exception

4
Hie Leute,

ich habe folgendes Problem. An einer bestimmten Stelle zeige ich in meinem Programm ein Infofenster an. Dieses Fenster wird nach 10 Sekunden automatisch via Close() ducrh einen Timer geschlossen.

Wenn man das Fenster mit der Maus festhält, während der Timer abläuft, wird es durch Close() nicht geschlossen. Kann es sein das in der Close-Methode

SendMessage(NativeMethods.WM_CLOSE, 0, 0);

keine Wirkung hat, wenn man das Fenster mit der Maus festhält? Und kennt jemand eine Möglichkeit dies zu ändern?
News:
09.07.2012
Anika 223 6
3 Antworten
3
Ich schließe das Fenster jetzt über Dispose() anstatt Close().

"Erzwingen" kann man das Schließen (wenn man Close() verwenden möchte), wenn man Windows ein WM_LBUTTONUP schickt. Anscheinend wird wirklich bis zum MouseUp-gewartet, bis Windows ein modales Fenster schließt.

[DllImport("user32.dll", CharSet = CharSet.Auto)]
static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam);

SendMessage(Handle, 0x202, IntPtr.Zero, IntPtr.Zero);
09.07.2012
Anika 223 6
Perfekt. Danach habe ich auch eben gesucht :-) Dachte, ein Mouseup zu erzwingen, sollte es lösen!
JEwen 09.07.2012
0
Also, dies kann ich bei normaler Verwendung eines Timers, Formulars und korrektem Schließen des Formulars (.NET, c#) nicht bestätigen. Das Fenster wird immer geschlossen, auch wenn ich es mit der Maus festhalte.

Ein paar Informationen, Quelltextbeispiel etc. mehr, wären da sehr hilfreich.
09.07.2012
JEwen 2,7k 5
0
Ja, sehr gerne. Das Form callFailedInfo wird von einem anderen Form modal geöffnet.

FormInfo callFailedInfo = new FormInfo(args.DisplayDuration);
callFailedInfo.Owner = this;
if (callFailedInfo.ShowDialog(this) == DialogResult.Abort)
{
args.ChangeRequired = true;
}


Das Form callFailedInfo besitzt einen Timer, der bei jedem Tick timeLeft um 1 herunterzählt (startet bei 10 bis 0). Wenn ich jetzt das Form festhalte, geht es nicht zu und timeLeft nimmt negative Werte an. Es wird auch leider keine Exception geworfen.

private void HandleTimerCountDown_Tick(object sender, EventArgs args)
{
timeLeft -= 1;
labelInfo.Text = string.Format(Captions.FormInfo_HandleTimerCountDown_Tick_Sie_werden_in__0__s_wieder_auf__frei__gesetzt___, timeLeft);
if (timeLeft <= 0)
{
Close();
}
}


Close() wird jedes Mal aufgerufen, aber es scheint keine Wirkung zu haben. Sobald ich die Maus los lasse, funktioniert alles wie gewollt und das Fenster geht zu.
09.07.2012
Anika 223 6
Wird vielleicht in einem MouseDown-Handler, FormMove-Handler o. ä. (habe die Bezeichnungen nicht mehr genau im Kopf) eine blockierende Aktion durchgeführt. Möglicherweise verhindert das die Ausführung von Close(), während das Fenster festgehalten wird.
jsc 09.07.2012
Was passiert, wenn du nach Close(); Application.DoEvents(); aufrufst?
puls200 09.07.2012
Leider bewirkt Application.DoEvents nichts.
Anika 09.07.2012
OnClosing(CancelEventArgs args) wird noch ausgelöst und darin ist in den CancelEventArgs Cancel noch auf false gesetzt. Aber danach muss irgenwas Cancel auf true setzen...
Anika 09.07.2012
Also, so nachgebaut, kann ich das tatsächlich bestätigen. Hält man das Formular fest, wird es nicht geschlossen. Interessant! OnClosing wird ausgelöst, Cancel ist auch false, aber es schliesst erst nach loslassen der Maustaste. Anscheinend hat in diesem Moment Windows die komplette Kontrolle über das Fenster.
JEwen 09.07.2012
Für mich macht es irgendwie Sinn, dass das Formular nicht geschlossen wird, da ich mit ihm interagiere, wenn ich es mit der Maus festhalte. Ich stelle mir gerade das dumme Gesicht eines Anwenders vor, wenn das Fenster auf einmal verschwindet während er es verschiebt :-))
luedi 10.07.2012

Stelle deine .net-Frage jetzt!