كيفية وضع .صافي التطبيق في علبة النظام عندما والحد منها ؟

StackOverflow https://stackoverflow.com/questions/76079

  •  09-06-2019
  •  | 
  •  

سؤال

يمكن لأي شخص يرجى توحي جيد المثال التعليمات البرمجية من vb.net/c# كود لوضع التطبيق في علبة النظام عندما minized.

هل كانت مفيدة؟

المحلول

إضافة NotifyIcon التحكم إلى النموذج الخاص بك ، ثم استخدام التعليمات البرمجية التالية:

    private void frm_main_Resize(object sender, EventArgs e)
    {
        if (this.WindowState == FormWindowState.Minimized)
        {
           this.ShowInTaskbar = false;
           this.Hide();
           notifyIcon1.Visible = true;
        }
    }

    private void notifyIcon1_MouseDoubleClick(object sender, MouseEventArgs e)
    {
        this.Show();
        this.WindowState = FormWindowState.Normal;
        this.ShowInTaskbar = true;
        notifyIcon1.Visible = false;
    }

قد لا تحتاج إلى تعيين ShowInTaskbar الملكية.

نصائح أخرى

يمكنك الاستفادة من المدمج في التحكم يسمى NotifyIcon.وهذا يخلق رمز علبة عندما يظهر.@فيليب لديه رمز المثال كاملة إلى حد ما.

هناك مسكتك على الرغم من:

يجب تجاوز التطبيقات الخاصة بك في النموذج الرئيسي التصرف طريقة للاتصال التصرف على NotifyIcon ، وإلا فإنه سيبقى في صينية بعد إنهاء التطبيق.

public void Form_Dispose(object sender, EventArgs e)
{
   if (this.Disposing)
      notifyIcon1.Dispose();
}

شيء من هذا القبيل.

يمكنك القيام بذلك عن طريق إضافة NotifyIcon إلى النموذج التعامل مع النموذج تغيير حجم الحدث.العودة من الدرج التعامل مع NotifyIcon مزدوج-انقر فوق الحدث.

إذا كنت ترغب في إضافة القليل من الرسوم المتحركة يمكنك القيام بذلك أيضا...

1) إضافة الوحدة النمطية التالي:

Module AnimatedMinimizeToTray
Structure RECT
    Public left As Integer
    Public top As Integer
    Public right As Integer
    Public bottom As Integer
End Structure

Structure APPBARDATA
    Public cbSize As Integer
    Public hWnd As IntPtr
    Public uCallbackMessage As Integer
    Public uEdge As ABEdge
    Public rc As RECT
    Public lParam As IntPtr
End Structure

Enum ABMsg
    ABM_NEW = 0
    ABM_REMOVE = 1
    ABM_QUERYPOS = 2
    ABM_SETPOS = 3
    ABM_GETSTATE = 4
    ABM_GETTASKBARPOS = 5
    ABM_ACTIVATE = 6
    ABM_GETAUTOHIDEBAR = 7
    ABM_SETAUTOHIDEBAR = 8
    ABM_WINDOWPOSCHANGED = 9
    ABM_SETSTATE = 10
End Enum

Enum ABNotify
    ABN_STATECHANGE = 0
    ABN_POSCHANGED
    ABN_FULLSCREENAPP
    ABN_WINDOWARRANGE
End Enum

Enum ABEdge
    ABE_LEFT = 0
    ABE_TOP
    ABE_RIGHT
    ABE_BOTTOM
End Enum

Public Declare Function SHAppBarMessage Lib "shell32.dll" Alias "SHAppBarMessage" (ByVal dwMessage As Integer, ByRef pData As APPBARDATA) As Integer
Public Const ABM_GETTASKBARPOS As Integer = &H5&
Public Const WM_SYSCOMMAND As Integer = &H112
Public Const SC_MINIMIZE As Integer = &HF020

Public Sub AnimateWindow(ByVal ToTray As Boolean, ByRef frm As Form, ByRef icon As NotifyIcon)
    ' get the screen dimensions
    Dim screenRect As Rectangle = Screen.GetBounds(frm.Location)

    ' figure out where the taskbar is (and consequently the tray)
    Dim destPoint As Point
    Dim BarData As APPBARDATA
    BarData.cbSize = System.Runtime.InteropServices.Marshal.SizeOf(BarData)
    SHAppBarMessage(ABMsg.ABM_GETTASKBARPOS, BarData)
    Select Case BarData.uEdge
        Case ABEdge.ABE_BOTTOM, ABEdge.ABE_RIGHT
            ' Tray is to the Bottom Right
            destPoint = New Point(screenRect.Width, screenRect.Height)

        Case ABEdge.ABE_LEFT
            ' Tray is to the Bottom Left
            destPoint = New Point(0, screenRect.Height)

        Case ABEdge.ABE_TOP
            ' Tray is to the Top Right
            destPoint = New Point(screenRect.Width, 0)

    End Select

    ' setup our loop based on the direction
    Dim a, b, s As Single
    If ToTray Then
        a = 0
        b = 1
        s = 0.05
    Else
        a = 1
        b = 0
        s = -0.05
    End If

    ' "animate" the window
    Dim curPoint As Point, curSize As Size
    Dim startPoint As Point = frm.Location
    Dim dWidth As Integer = destPoint.X - startPoint.X
    Dim dHeight As Integer = destPoint.Y - startPoint.Y
    Dim startWidth As Integer = frm.Width
    Dim startHeight As Integer = frm.Height
    Dim i As Single
    For i = a To b Step s
        curPoint = New Point(startPoint.X + i * dWidth, startPoint.Y + i * dHeight)
        curSize = New Size((1 - i) * startWidth, (1 - i) * startHeight)
        ControlPaint.DrawReversibleFrame(New Rectangle(curPoint, curSize), frm.BackColor, FrameStyle.Thick)
        System.Threading.Thread.Sleep(15)
        ControlPaint.DrawReversibleFrame(New Rectangle(curPoint, curSize), frm.BackColor, FrameStyle.Thick)
    Next


    If ToTray Then
        ' hide the form and show the notifyicon
        frm.Hide()
        icon.Visible = True
    Else
        ' hide the notifyicon and show the form
        icon.Visible = False
        frm.Show()
    End If

End Sub
End Module

2) إضافة NotifyIcon إلى النموذج الخاص بك الوظيفة الإضافية التالية:

Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
    If m.Msg = WM_SYSCOMMAND AndAlso m.WParam.ToInt32() = SC_MINIMIZE Then
        AnimateWindow(True, Me, NotifyIcon1)
        Exit Sub
    End If
    MyBase.WndProc(m)
End Sub

Private Sub NotifyIcon1_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles NotifyIcon1.DoubleClick
    AnimateWindow(False, Me, NotifyIcon1)
End Sub
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top