Autor Beitrag
Catscratch
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Do 19.03.09 11:46 
Hallo,

ich hab ein Programm geschrieben, was durch verschiedene globale Shortcuts unterschiedliche Aktionen auslöst.

Wenn ich mein Fenster minimiere, soll das Programm in den Tray Modus wechseln. Das hab ich mit folgender Funktion realisiert, da sonst die Shortcuts nicht mehr reagierten (wenn ich einfach das Visible auf false gesetzt hab).

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
[DllImport("User32.dll")]
private static extern void SetWindowPos (int hWnd,
                                         int hWndInsertAfter,
                                         int x,
                                         int y,
                                         int cx,
                                         int cy,
                                         int wFlags);

private void TaskBarVisible(int FormHandle, bool Visible)
{
    if (Visible == true)
       SetWindowPos (FormHandle, 0000064);
    else
       SetWindowPos (FormHandle, 00000128);
}


Beim klickt auf den Minimieren-Button, wir dann diese Funktion ausgelöst.

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
private void Form1_Resize(object sender, System.EventArgs e)
{    
    if (this.WindowState == FormWindowState.Minimized)
    {
       this.trayIcon.ContextMenuStrip = contextMenu;
       TaskBarVisible((int)this.Handle, false);
       this.trayIcon.Visible = true;
    }    
}


Das klappt auch alles wunderbar. Jetzt will ich das Programm aber minimiert im Tray Modus starten lassen, also hab ich mir gesagt, löst ich einfach die gleiche Funktion im Konstruktor des Forms aus. (Habs auch in der Form1_Load Methode probiert):

ausblenden C#-Quelltext
1:
2:
3:
4:
this.WindowState = FormWindowState.Minimized;
this.trayIcon.ContextMenuStrip = contextMenu;
TaskBarVisible((int)this.Handle, false);
this.trayIcon.Visible = true;


Was passiert? Das Fenster startet minimiert und das Trayicon ist zu sehen. Allerdings verschwindet es nicht aus der Taskleiste. Wenn ich es dann aus dieser wiederherstelle und von Hand auf Minimieren klicke, funktioniert es wie gehabt richtig.

Kann mir jemand einen Tipp geben, wo das Problem liegt?

Besten Dank.
Console.Beep()
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 43

Win XP, Ubuntu 8.10
C# (VS 2008 Exp) C++ (VS 2008 Exp)
BeitragVerfasst: Do 19.03.09 12:16 
der grund ist dass das nicht funst ist vermutlich das:
ausblenden C#-Quelltext
1:
private void Form1_Resize(object sender, System.EventArgs e)					


das wird erst ausgelöst wenn das Form seine Größe ändert. Du musst versuchen ein Event für die minimierung zu erstellen um dann beim Auslösen des erstellten Events die Funktion aufzurufen.

_________________
Ihr zweifelt an der Existenz der If-Schleife??? Ihr müsst nur fest daran glauben!!!
Catscratch Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Do 19.03.09 12:22 
Das hab ich jetzt nicht richtig verstanden.

Ich versuche doch schon "Quelltext 3" direkt auszuführen. Also außerhalb der Resize-Funktion. Ist es nicht theoretisch egal, ob ich ein Event auslöse und diese Funktion aufgerufen wird oder ob ich den Inhalt der Funktion im Konstruktor des Forms direkt aufrufe?
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Do 19.03.09 13:47 
Gibt es einen Grund warum du die Sichtbarkeit in der Taskbar nicht einfach über die Form.ShowInTaskBar Property steuerst?
Catscratch Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Do 19.03.09 13:56 
Ja, wenn ich es damit mache...sind die Shortcuts die ich gesetzt habe (Global Hotkeys) nicht mehr aktiv, sondern erst wieder, wenn das Programm in der Taskleiste sichtbar gemacht wird.
Greenberet
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 339
Erhaltene Danke: 20

Win 10
C# (VS 2012), C++ (VS 2012/GCC), PAWN(Notepad++), Java(NetBeans)
BeitragVerfasst: Do 19.03.09 15:18 
Nachdem du schon PInvoke verwendest...Hast du es schon mit LowLevelKeyboard Hooks probiert?
such einfach hier im forum nach keyboard hooks da gibts schon ein paar threads dazu.
Catscratch Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Do 19.03.09 15:35 
Hallo,

also wenn ich das Recht verstehe, soll ich die Problematik von oben derart umgehen, dass ich einfach die Hotkeys anders definiere, um dann das Fenster über "normale" Mechanismen zu minimieren?

Das ist sicher eine Möglichkeit. Ich werde mir die Keyboard Hook Thematik mal ansehen. Aber dennoch interessiert mich, warum das o.g. Vorgehen nicht funktioniert? Es werden ja in beiden Fällen die gleichen Kommandos abgesetzt. Nur einmal funktionierts und an anderer Stelle nicht.
Ich kann mir nur vorstellen, dass beim Klick auf den Minimieren-Button eines Fensters durchs System mehr modifiziert wird als nur WindowState auf Minimized zu setzen. Und genau diese Operation fehlt wohl, wenn ich das Fenster manuell minimiere...nur weiß ich eben nicht, was dort noch passiert ist. (War das verständlich? ;-) )

mfg
Catscratch Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Mi 25.03.09 09:22 
Hallo,

die Lösung war relativ einfach. In nem anderen Forum hab ich den entscheidenden Tipp bekommen.

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
private void Form1_Load(object sender, EventArgs e)
{
    this.WindowState = FormWindowState.Minimized;
}

private void Form1_Shown(object sender, EventArgs e)
{
    if (this.WindowState == FormWindowState.Minimized)
    {
       this.trayIcon.ContextMenuStrip = contextMenu;
       TaskBarVisible((int)this.Handle, false);
       this.trayIcon.Visible = true;
    }
}


Man darf das Taskbar-Window erst ausblenden, wenn das Fenster komplett geladen wurde, sonst wirds im Initialisierungsprozess wieder überschrieben.

MFG