Frage

Da Compact Framework Anrufe Show() auf dem zu Application.Run() weitergegeben Form, entschied ich mich zu erstellen eigene Meldungsverteilschleife.

Ich habe keine Ahnung, wie kann ich das tun.

Jede Hilfe (wie ein einfaches Beispiel) wird geschätzt.

War es hilfreich?

Lösung

  • Haben Sie versucht, das VisibleChanged Ereignis zu fangen?

this.Shown += new EventHandler(Form1_Shown);

void Form1_Shown(object sender, EventArgs e)
{
    this.Hide();
}
  • Sie können auch versuchen, die Nachricht abzufangen durch die zwingende WndProc .
    protected override void WndProc(ref Message m)
    {
        const int SW_SHOW = 5;
        if (m.Msg == SW_SHOW)
        {
            //DoSomething();
        }

        base.WndProc(ref m);
    }
  • Eine typische Meldungsverteilschleife sieht wie folgt aus:
MSG msg;
while(GetMessage(&msg, hwnd, 0, 0))
{
    TranslateMessage(&msg);
    DispatchMessage(&msg);
    // DoSomething.
}

Andere Tipps

Ich fand dies ein größeres Problem zu sein, als würden Sie antizipieren für eine Windows-Anwendung bilden. Für meine Lösung zog ich Vorschläge aus drei verschiedenen Website und fand diese Lösung sehr gut funktionieren. Für meine Bedürfnisse habe ich einen Windows-Dienst, der eine UI-Controller-Komponente in der Taskleiste hat. Die Benutzeroberfläche muss starten minimierte nur mit dem Tray-Icon und ein Kontextmenü für das Symbol. Die Benutzeroberfläche arbeitet als modalen Dialog, wenn sie aktiviert, den Benutzer erlaubt, einen langen laufenden Prozess auf einem Hintergrund-Thread zu starten, sobald die UI-Anforderungen gestartet Antworten vom Benutzer wieder aufnehmen nehmen.

Im Konstruktor für die Windows Form-Klasse habe ich die ControlBox auf und die Schaltflächen Minimieren und Maximieren deaktiviert:

public SystemTrayApp()
{
    InitializeComponent();
    this.Visible = false;
    // Hide Maximize and Minimize buttons on form
    this.StartPosition = FormStartPosition.CenterScreen;
    this.MaximizeBox = false;
    this.MinimizeBox = false;
}

Die ControlBox Bedürfnisse ermöglichen, damit der Benutzer den Dialog über den Bildschirm zu bewegen, aber es nicht Größe, die Form Schließen-Schaltfläche, rot X in der oberen rechten Ecke der Form zu deaktivieren, habe ich:

// Force form close button to be disabled
private const int CP_NOCLOSE_BUTTON = 0x200;
protected override CreateParams CreateParams 
{
   get 
   {
      CreateParams cp = base.CreateParams;
      cp.ClassStyle = cp.ClassStyle | CP_NOCLOSE_BUTTON;
      return cp;
   }
}

Im Hauptprogramm, wo die statische Methode Main läuft auf Anwendung Start-up, ich den Standard-Application.Run geändert:

static class Program
{
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        SystemTrayApp systemTrayApp = new SystemTrayApp();
        systemTrayApp.Text = "File Copy Service Controller";

        // Show the instance of the form modally.
        systemTrayApp.ShowInTaskbar = true;
        systemTrayApp.ShowDialog();
        Application.Run();
    }
 }

zeigen nun die Design-Seite für das Windows-Formular mit der rechten klicken Sie auf die Form und wählen Sie Eigenschaften, neben wählen Sie die Schaltfläche Ereignisse für das Formular für alle Veranstaltungen zu zeigen. Blättern Sie nach unten auf das Gezeigte Ereignis, und doppelklicken Sie, ein neuer Event-Handler wird in Ihren Quellcode hinzugefügt werden. Navigieren Sie zu dem Verfahren und Add this.Hide() an den Handler:

// Runs the first time the application starts
private void SystemTrayApp_Shown(object sender, EventArgs e)
{
   this.Hide();
}

öffnet schließlich die Eigenschaftenseite für das Projekt Windows Form und wählen Sie die Registerkarte Anwendung. Unter Startobjekt, wählen Sie die Programmklasse als Startobjekt.

Sie müssen eine Taste oder eine Menüsteuerung zu Ihrem Dialog hinzufügen, um die Form zu ermöglichen, zu schließen, ohne die Anwendung beendet wird, stellen Sie die Taste oder Menüsteuerung, die Anwendung zu verstecken, es zu verlassen in der Taskleiste ausgeführt wird.

die Nachrichtenschleife in der Anwendungsklasse zu ersetzen, ist nicht praktikabel. Es ist weit mehr los dann die Windows-Textnachrichtenschleife. Es ist nicht das eigentliche Problem ohnehin die Anwendungsklassenkräfte der Form sichtbar werden mit einem Aufruf von Showwindow (). Das ist notwendig, weil Formen träge initialisiert werden, ohne dass die Showwindow () aufrufen, erstellt es nie das native Fenstergriff.

Dieses Problem ist einfach zu fix in der regulären .NET Framework-Version von SetVisibleCore überschreibt ():

protected override void SetVisibleCore(bool value) {
  if (!this.IsHandleCreated) {
    this.CreateHandle();
    value = false;  // Prevent becoming visible the first time
  }
  base.SetVisibleCore(value);
}

Aber ich glaube nicht, dass in CF. verfügbar ist Um eine Lösung zu finden, werden Sie erklären müssen genau Warum Sie wollen von der Benutzeroberfläche verhindern gezeigt. Ohne erstellt Fenstergriff, ist eine App in der Regel mausetot. Es könnte so einfach sein wie die Application.Run () -Aufruf zu verzögern.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top