[WM]最大化我的應用程式

在撰寫應用程式的時候後常常會遇到需要將應用程式最大化的需求,尤其是當你的應用程式有特定用途的時候(例如用PDA+GPS去記錄GPS軌跡),這個時候要怎麼做呢?

在撰寫應用程式的時候後常常會遇到需要將應用程式最大化的需求,尤其是當你的應用程式有特定用途的時候(例如用PDA+GPS去記錄GPS軌跡),這個時候要怎麼做呢?
其實在WM系統中要最大化程式不困難,只要將Form給最大化就可以了,像是下面這樣

Me.WindowState = FormWindowState.Maximized

有關WindowState的部分建議這篇一起看一下Form.show?Form.showdialog
一行程式碼就可以搞定最大化的需求;接下來,按了"Window 鍵"之後,"功能表"跳了出來,但是我不想讓功能表可以跳出來,那麼應該怎麼辦呢?這時候就要借助一下Shell API了,有關Shell API可以參考這邊
SHFullScreen
首先需要先宣告API,會像下面這樣

''Reference:http://msdn.microsoft.com/en-us/library/aa457115.aspx
     _
    Shared Function SHFullScreen(ByVal hwndRequester As IntPtr, ByVal dwState As UInt32) As Int32
    End Function

接下來是一些常數的定義

Const SHFS_SHOWTASKBAR As UInt32 = &H1
    Const SHFS_HIDETASKBAR As UInt32 = &H2
    Const SHFS_SHOWSIPBUTTON As UInt32 = &H4
    Const SHFS_HIDESIPBUTTON As UInt32 = &H8
    Const SHFS_SHOWSTARTICON As UInt32 = &H10
    Const SHFS_HIDESTARTICON As UInt32 = &H20

由常數定義的名稱我們就可以看出一些端倪,要將功能表取消掉,我們就必須用HIDESTARTICON,所以利用下面的方式就可以隱藏"開始功能表"的項目了

SHFullScreen(Me.Handle, SHFS_HIDESTARTICON)

由下面兩張圖我們可以看出服用前跟服用後的效果
 

 


這樣就可以讓"Window 鍵"失去作用了,但是可能還有其他的一些硬體按鍵,例如廠商自訂的可以把行事曆或是IE叫出來等等的按鍵,那怎麼辦呢?這時候就要借助HardwareButton的功能了(請特別注意,profression版本的撥打電話跟掛斷電話這個是控制不到的),利用下面的方式可以將硬體按鍵所產生的事件交由應用程式來控制

Imports Microsoft.WindowsCE.Forms
Imports System.Runtime.InteropServices

Public Class Form1

    Const SHFS_SHOWTASKBAR As UInt32 = &H1
    Const SHFS_HIDETASKBAR As UInt32 = &H2
    Const SHFS_SHOWSIPBUTTON As UInt32 = &H4
    Const SHFS_HIDESIPBUTTON As UInt32 = &H8
    Const SHFS_SHOWSTARTICON As UInt32 = &H10
    Const SHFS_HIDESTARTICON As UInt32 = &H20
    ''判斷目前Menu是否顯示中
    Dim bolShowMenu As Boolean = True

    Dim hbtn(5) As HardwareButton

    ''Reference:http://msdn.microsoft.com/en-us/library/aa457115.aspx
     _
    Shared Function SHFullScreen(ByVal hwndRequester As IntPtr, ByVal dwState As UInt32) As Int32
    End Function

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        ''設定hardware button
        For i As Integer = 0 To 5
            hbtn(i) = New HardwareButton
            hbtn(i).HardwareKey = 193 + i
            hbtn(i).AssociatedControl = Me
        Next
    End Sub

    ''' 
    ''' 最大化視窗
    ''' 
    ''' 
    ''' 
    ''' 
    Private Sub mnuMaxSize_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuMaxSize.Click
        If mnuMaxSize.Checked Then
            Me.WindowState = FormWindowState.Normal
        Else
            Me.WindowState = FormWindowState.Maximized
        End If
        mnuMaxSize.Checked = Not mnuMaxSize.Checked
    End Sub

    ''' 
    ''' 顯示或是隱藏輸入法輸入按鈕
    ''' 
    ''' 
    ''' 
    ''' 
    Private Sub mnuShowSIP_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuShowSIP.Click
        If mnuShowSIP.Checked Then
            SHFullScreen(Me.Handle, SHFS_SHOWSIPBUTTON)
        Else
            SHFullScreen(Me.Handle, SHFS_HIDESIPBUTTON)
        End If
        mnuShowSIP.Checked = Not mnuShowSIP.Checked
    End Sub

    ''' 
    ''' 顯示或是隱藏"開始"的圖示
    ''' 
    ''' 
    ''' 
    ''' 
    Private Sub mnuShowStart_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuShowStart.Click
        If mnuShowStart.Checked Then
            SHFullScreen(Me.Handle, SHFS_SHOWSTARTICON)
        Else
            SHFullScreen(Me.Handle, SHFS_HIDESTARTICON)
        End If
        mnuShowStart.Checked = Not mnuShowStart.Checked
    End Sub

    ''' 
    ''' 顯示或是隱藏標題列
    ''' 
    ''' 
    ''' 
    ''' 
    Private Sub mnuShowTaskbar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuShowTaskbar.Click
        If mnuShowTaskbar.Checked Then
            SHFullScreen(Me.Handle, SHFS_SHOWTASKBAR)
        Else
            SHFullScreen(Me.Handle, SHFS_HIDETASKBAR)
        End If
        mnuShowTaskbar.Checked = Not mnuShowTaskbar.Checked
    End Sub

    ''' 
    ''' 顯示或是隱藏Menu
    ''' 
    ''' 
    ''' 
    ''' 
    Private Sub btnHideMenu_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnHideMenu.Click
        If bolShowMenu Then
            Me.Menu = Nothing
            btnHideMenu.Text = "Show menu"
        Else
            Me.Menu = MainMenu1
            btnHideMenu.Text = "Hide menu"
        End If
        bolShowMenu = Not bolShowMenu
    End Sub

    ''' 
    ''' 關閉應用程式
    ''' 
    ''' 
    ''' 
    ''' 
    Private Sub mnuExit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuExit.Click
        Application.Exit()
    End Sub

    Private Sub Form1_KeyDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles MyBase.KeyDown
        TextBox1.Text = e.KeyCode
    End Sub
End Class

完整的測試程式碼也可以在這邊下載