Hur får man sitt program att lägga sig där? Du använder dig av System.Windows.Forms.NotifyIcon Du kontroller om seneder är av typen NotifyIcon. Borde det inte vara MenuItem1 som blir sender? efter som det är ju dess event som anropar close metoden? Syftar du på denna? "Form1_Closing" denna utförs då du stänger Form fönstret. japp det har du rätt i, att det är MenuItem1 som blir sender till sina egna events. "Call Form1_Closing(I, ???) VAD SKALL DET VARA HÄR!!! " Gör följande: Fattar inte... Saken är den att när du trycker på X så anropar du enbart Form1_closing eventet, TACKAR!!! Ok, då kan du använda dig av Form.Show för att få focus och Form.Hide för att gömma formen. Tänk på att denna kod måste ligga i din Form klass. men... Det löser du med Application.Exit() den triggar inte Closing. "jag vill bara avsluta programmet om jag dubbel-clickar på NotifyIconen. Så här ser det ut. Detta räcker:Aktivitetsfältet där klockan är(de små ikonerna).
/AlexanderSv: Aktivitetsfältet där klockan är(de små ikonerna).
<code>
Friend WithEvents notifyIcon1 As System.Windows.Forms.NotifyIcon
Public sub New()
Me.notifyIcon1 = New System.Windows.Forms.NotifyIcon(Me.components)
'Ikonen som ska visas
notifyIcon1.Icon = New Icon("appicon.ico")
'Om du har en context menu du vill koppla på ikonen
notifyIcon1.ContextMenu = Me.yourContextMenu
'texten som ska visas i tooltip
notifyIcon1.Text = "Mitt Program"
notifyIcon1.Visible = True
End Sub
</code>
/Fredrik NSv: Aktivitetsfältet där klockan är(de små ikonerna).
Funkar kanon! TACK!
Hur kollar man om NotifyIcon är 'Sender'
<code>
Private Sub Form1_Closing(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles MyBase.Closing
'Hur kollar man om NotifyIcon är 'Sender'
e.Cancel = True
Me.ShowInTaskbar = False
Me.Visible = False
End Sub
Private Sub I_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles I.DoubleClick
Me.ShowInTaskbar = True
Me.Visible = True
End Sub
Private Sub MenuItem1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItem1.Click
Me.Close()
End Sub
</code>Sv: Aktivitetsfältet där klockan är(de små ikonerna).
Va ett tag sedan jag programmerade VB men något likt dettaa kan kanske fungera:
<code>
if TypeOf sender Is NotifyIcon then
</code>
/Fredrik NSv: Aktivitetsfältet där klockan är(de små ikonerna).
Sv: Aktivitetsfältet där klockan är(de små ikonerna).
Closing eventet triggas när du ex gör en me.Close() vilket gör att Sender blir
dem del som utför close. I detta fall är det bara Form1 som kan bli Sender
då det är den som ropar på Closing eventet. Om du inte sett till att NotiFyIcon eventen skall trigga Form1_Closing... Men av koden att bedömma är det bara Form1 som kommer att trigga Form1_Closing.
//Johan NSv: Aktivitetsfältet där klockan är(de små ikonerna).
Medans NotifyIcon blir sender till sina egna events. Men, man kan ha kopplat på ett event extra på NotifyIcon som tex anropar close och då blir sender NotifyIcon. Tex om man dbl klickar på NotifyIcon så kanske man lägger till att klicket ska trigga ett close event som tex form använder sig eller annat, och då blir den som triggar eventet sender.
/Fredrik NSv: Aktivitetsfältet där klockan är(de små ikonerna).
<code>
Private Sub Form1_Closing(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles MyBase.Closing GICK EJ ATT HA I.DBL_CLICK
'Hur kollar man om NotifyIcon är 'Sender'
If TypeOf sender Is NotifyIcon Then
e.Cancel = True
Me.ShowInTaskbar = False
Me.Visible = False
End If
End Sub
Private Sub I_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles I.DoubleClick
Me.ShowInTaskbar = True
Me.Visible = True
End Sub
Private Sub MenuItem1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItem1.Click
Call Form1_Closing(I, ???) VAD SKALL DET VARA HÄR!!!
End Sub
</code>Sv: Aktivitetsfältet där klockan är(de små ikonerna).
me.Close()
//Johan NSv: Aktivitetsfältet där klockan är(de små ikonerna).
<code>
Private Sub Form1_Closing(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles MyBase.Closing
e.Cancel = True
Me.ShowInTaskbar = False
Me.Visible = False
End Sub
Private Sub I_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles I.DoubleClick
Me.ShowInTaskbar = True
Me.Visible = True
End Sub
Private Sub MenuItem1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItem1.Click
'Call Form1_Closing(I, ???) VAD SKALL DET VARA HÄR!!!
Me.Close() '<---- Denna rad kommer att anropa din Form1_Closing event. Om Me är Form1 objektet.
End Sub
</code>
/Fredrik NSv: Aktivitetsfältet där klockan är(de små ikonerna).
Men om det är så här du menar så larmar det på ...they don´t have the same signature
REV: Såg ditt inlägg nu som är över.
REV2: Det är jag med på men jag vill bara avsluta programmet om jag dubbel-clickar på NotifyIconen. Om man trycker på "X" så skall formen gömmas och aktiveras när man enkelklickar på notify.
Måste avgöra vem som är sender i Closing?
<code>
Private Sub Form1_Closing(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles MyBase.Closing, I.DoubleClick
'Hur kollar man om NotifyIcon är 'Sender'
If TypeOf sender Is NotifyIcon Then
e.Cancel = True
Me.ShowInTaskbar = False
Me.Visible = False
End If
End Sub
</code>Sv: Aktivitetsfältet där klockan är(de små ikonerna).
när du kör din dubbelklick kör du först Dubbelklick evetnetet och sedan Form1.Closing.
Det betyder att du vid dubbelclick eventet skriver in vad du vill skall hända.
//Johan NSv: Aktivitetsfältet där klockan är(de små ikonerna).
Nu ramlade polleten ner!
GLAD MIDSOMMAR!Sv: Aktivitetsfältet där klockan är(de små ikonerna).
tex:
<code>
Private Sub Form1_Closing(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles MyBase.Closing
e.Cancel = True
Me.Hide()
End Sub
Private Sub I_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles I.DoubleClick
Me.Show()
' Ev Me.Activate()
End Sub
</code>
/Fredrik NSv: Aktivitetsfältet där klockan är(de små ikonerna).
När jag anropar me.close körs ju Form1_Closing och då sätts alltid e.Cancel = True och då avslutas ju ALDRIG formen.Sv: Aktivitetsfältet där klockan är(de små ikonerna).
/Fredrik NSv: Aktivitetsfältet där klockan är(de små ikonerna).
Detta bryter lite mot klassika användargränsnitt. Oftast vill man öppna något via dubbel klick. Så Jag personligen tycker du skall göra så att när man trycker höger musknapp på NotifyIconen kommer det upp en meny med en Close metod, som
då Anropar ditt Closing Event.
"Om man trycker på "X" så skall formen gömmas och aktiveras när man enkelklickar på notify. "
Med denna lösning kan du aldrig döda din applikation. Eftersom X alltid kommer att
anropa Form1_closing vilket är nödvändigt för att kunna döda din applikation.
Vad du kan göra är Att du bara kör en Notifications icon med meny och funktion vid dubbelklick, Sedan öppnar du ett nytt form med funktionaliteten, detta form kommer då ha sin egna close, vilket gör att när du trycker på X så kommer bara det formet att stängas och notifications iconen finns kvar. Är du med?
Form1 = visar bara Notifications iconen. Du har en me.Close på denna då du vill stänga den. Vill du öppna ett form skapar du ett nytt som du öppnar som har sin Closing funktionalitet.
Eller använda Application.Exit()
//Johan NSv: Aktivitetsfältet där klockan är(de små ikonerna).
Men man får nog tänka om och ha flera Forms...som du skriver.
<code>
Public WithEvents I As System.Windows.Forms.NotifyIcon
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
I = New System.Windows.Forms.NotifyIcon()
I.Icon = New Icon("icon1.ico")
I.ContextMenu = Me.ContextMenu1 'Meny för att AVSLUTA programmet.
I.Text = "Mitt Program"
I.Visible = True
End Sub
Private Sub Form1_Closing(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles MyBase.Closing
If TypeOf sender Is Form1 Then 'Då skall man bara gömma den.
e.Cancel = True
Me.ShowInTaskbar = False
Me.Visible = False
End If
End Sub
Private Sub I_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles I.DoubleClick
Me.ShowInTaskbar = True
Me.Visible = True
End Sub
Private Sub MenuItem1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItem1.Click
OM MAN SKRIVER APPLICATION.CLOSE HÄR SÅ BLEV DET SOM JAG VILLE.
MEN ÄR DET RÄTT ATT GÖRA SÅ!!!
Me.Close() 'Triggar Form1_Closing
End Sub
End Class
</code>Sv: Aktivitetsfältet där klockan är(de små ikonerna).
<code>
Public WithEvents I As System.Windows.Forms.NotifyIcon
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
I = New System.Windows.Forms.NotifyIcon()
I.Icon = New Icon("icon1.ico")
I.ContextMenu = Me.ContextMenu1 'Meny för att AVSLUTA programmet.
I.Text = "Mitt Program"
I.Visible = True
End Sub
Private Sub Form1_Closing(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles MyBase.Closing
'If TypeOf sender Is Form1 Then 'Då skall man bara gömma den.
'SENDER kommer alltid förbli Form1 så länge du inte kopplar på fler Handles som har samma signatur som Closing eventet. Så du kan ta bort denna if.
e.Cancel = True
Me.ShowInTaskbar = False
Me.Visible = False
End If
End Sub
Private Sub I_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles I.DoubleClick
Me.ShowInTaskbar = True
Me.Visible = True
End Sub
Private Sub MenuItem1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItem1.Click
Application.Excit() <-- Dödar hela applicationen. Allt dör då.
End Sub
End Class
</code>
Det beror lite på hur du vill göra din lösning. Om du vill trigga Event för att du kanske vill göra en massa saker innan applikationen dör. Excit dödar din applikation med en gång. I vissa fall vill man kanske ropa på ett event för att man vill ha en gemensam upprensning eller något vid stägning.
//Johan N