none
[VB.NET CF] 如何讓程式一執行就最小化? RRS feed

  • 問題

  • 各位新進大家好
    想請問如何讓程式一執行就最小化? 或是用事件來最小化 (像常駐一樣)
    我試過用主控台應用程式寫不過一執行完程式就結束了 (QQ 忘了只會執行一次)
    再用 WINDOWS FORM 應用程式寫卻找不到 Minimize 的功能
    只有 FormWindowState.Maximized 跟 FormWindowState.Normal

    平台:WM6  語言:VB.NET 2008 (CF 2.0)
    • 已編輯 LeonChen 2009年2月4日 上午 03:31
    2009年2月3日 下午 04:03

解答

  • 這有點偷吃步,用個timer來做最小化的動作,畫面會閃一下就是了

    Const SW_MINIMIZE As Integer = 6  
        Declare Function FindWindow Lib "coredll.dll" (ByVal className As Char(), ByVal WindowsName As Char()) As Integer 
        Declare Function ShowWindow Lib "coredll.dll" (ByVal hwnd As IntegerByVal nCmdShow As IntegerAs Boolean 
     
        Private Sub Timer1_Tick(ByVal sender As System.ObjectByVal e As System.EventArgs) Handles Timer1.Tick  
            Dim h As Integer = 0  
            h = FindWindow(Nothing"Form1".ToCharArray)   '已確認過FORM1.TEXT為FORM1,此處的 h 是否跟宣告的 h 重疊?         
            ShowWindow(h, SW_MINIMIZE)  
            Timer1.Enabled = False 
        End Sub 
     
        Private Sub Form1_Load(ByVal sender As System.ObjectByVal e As System.EventArgs) Handles MyBase.Load  
            Timer1.Enabled = True 
        End Sub 

    態度決定一切 ! - blog : http://bauann-makeit.blogspot.com/
    • 已標示為解答 LeonChen 2009年2月6日 上午 07:34
    2009年2月4日 下午 01:01
    版主

所有回覆

  •  參考一下下面有關Notifyicon的文章
    http://forums.microsoft.com/MSDN-CHT/Search/Search.aspx?words=notifyicon&searchKey=&lcid=1028&searchscope=forumgroupscope&siteid=14&ForumID=-1&ForumGroupID=61
    態度決定一切 ! - blog : http://bauann-makeit.blogspot.com/
    2009年2月4日 上午 01:55
    版主
  • 先感謝 bauann 兄
    您誤會我的意思了,Notifyicon 只會出現泡泡訊息而 TrayIcon 右下方的小圖示
    我要程式一執行就 Minimize 在背景執行,有文章寫到要用送出 OK 鍵的方法來達到
    可是是 C# 的不知道 VB.NET CF 要怎麼做?   謝謝

    2009年2月4日 上午 03:30
  •   如果你是要用鍵盤訊號去做,下面是宣告方式,你可以參考一下,VK_LWIN的對應碼你要搜尋一下,之前沒用過 XD
     
        Public Const VB_Back As Byte = &H8  
        Public Const KEYEVENTF_KEYUP As Integer = &H22  
        Public Const KEYEVENTF_KEYDOWN As Integer = &H0  
     
        <DllImport("coredll.dll")> _  
        Public Sub keybd_event(ByVal bVk As ByteByVal bScan As ByteByVal dwFlags As IntegerByVal dwExtraInfo As Integer)  
        End Sub 

    如果是下面這篇
    http://social.msdn.microsoft.com/forums/en-US/netfxcompact/thread/19931984-59d1-4e0f-8563-1bf3c4fb6324/
    用SowWindow跟FindWindow的話,轉成VB語法就可以了,例如

    Declare Function FindWindow Lib "coredll.dll" (ByVal className As Char(), ByVal   
    WindowsName As Char()) As Integer 
    呼叫範例
    Dim hWnd As Integer
    hWnd = FindWindow(Nothing"Form1".ToCharArray) 

    態度決定一切 ! - blog : http://bauann-makeit.blogspot.com/
    • 已標示為解答 LeonChen 2009年2月6日 上午 04:23
    • 已取消標示為解答 LeonChen 2009年2月6日 上午 07:34
    2009年2月4日 上午 03:49
    版主
  • bauann 兄
    我先測試了一下按鍵訊號的做法,VK_LWIN OK/CLOSE 按鍵的對應碼我還在找
    提示需先匯入 System.Runtime.InteropServices
    匯入後出現 System.Runtime.InteropServices.DllImportAttribute 無法套用至執行個體

    用SowWindow跟FindWindow的話,內容如下執行後無反應
    1 Public Class Form1  
    2     Declare Function FindWindow Lib "coredll.dll" (ByVal className As Char(), ByVal WindowsName As Char()) As Integer 
    3  
    4     Private Sub Form1_Load(ByVal sender As ObjectByVal e As System.EventArgs) Handles MyBase.Load  
    5         Dim hWnd As Integer 
    6         hWnd = FindWindow(Nothing"Form1".ToCharArray)  
    7     End Sub 
    8 End Class 


    2009年2月4日 上午 07:13
  •  有關第一點,你的API宣告是寫在什麼地方?貼個程式碼來瞧瞧吧 ~

     第二點的部分,有兩個API哩..我只列出一個,另一個ShowWindow也會用到的...orz

    const int SW_MINIMIZE = 6;  
    [DllImport("CoreDll")]  
    public static extern bool ShowWindow(IntPtr hwnd, int nCmdShow);  
    [DllImport("CoreDll")]  
    public static extern IntPtr FindWindow(string className, string WindowsName);  
    private void MinimizeWin(){  
    IntPtr hwnd = FindWindow(nullthis.Text) ; 
                  ShowWindow(hwnd, SW_MINIMIZE) ;

    轉成VB後
    Const SW_MINIMIZE As Integer = 6  
        Declare Function FindWindow Lib "coredll.dll" (ByVal className As Char(), ByVal WindowsName As Char()) As Integer 
        Declare Function ShowWindow Lib "coredll.dll" (ByVal hwnd As IntegerByVal nCmdShow As IntegerAs Boolean 
     
        Private Sub MinimizeWin()  
            Dim h As Integer = 0  
            h=FindWindow(Nothing"Form1".ToCharArray) ''Form1是你的form的text屬性  
            ShowWindow(h, SW_MINIMIZE)  
        End Sub 

    態度決定一切 ! - blog : http://bauann-makeit.blogspot.com/
    2009年2月4日 上午 08:58
    版主
  • 第一種方式的 CODE 如下 (VK_LWIN的對應碼還未更改)
    DllImport 會提示匯入System.Runtime.InteropServices
    匯入後出現 System.Runtime.InteropServices.DllImportAttribute 無法套用至執行個體

    1 Public Class Form1     
    2      Public Const VB_Back As Byte = &H8     
    3      Public Const KEYEVENTF_KEYUP As Integer = &H22     
    4      Public Const KEYEVENTF_KEYDOWN As Integer = &H0     
    5      
    6      <DllImport("coredll.dll")> _     
    7      Public Sub keybd_event(ByVal bVk As ByteByVal bScan As ByteByVal dwFlags As IntegerByVal dwExtraInfo As Integer)     
    8      End Sub    
    9 End Class 




    第二種方式的 CODE 如下
    我將MinimizeWin()改為在Form_Load執行但無反應,若改為在Form_Load 呼叫 MinimizeWin() 依然無反應

    1 Public Class Form1     
    2     Const SW_MINIMIZE As Integer = 6     
    3     Declare Function FindWindow Lib "coredll.dll" (ByVal className As Char(), ByVal WindowsName As Char()) As Integer    
    4     Declare Function ShowWindow Lib "coredll.dll" (ByVal hwnd As IntegerByVal nCmdShow As IntegerAs Boolean    
    5     
    6     Private Sub Form1_Load(ByVal sender As ObjectByVal e As System.EventArgs) Handles MyBase.Load     
    7         Dim h As Integer = 0     
    8         h = FindWindow(Nothing"Form1".ToCharArray)   '已確認過FORM1.TEXT為FORM1,此處的 h 是否跟宣告的 h 重疊?      
    9         ShowWindow(h, SW_MINIMIZE)     
    10     End Sub    
    11 End Class 
    2009年2月4日 下午 12:14
  • 這有點偷吃步,用個timer來做最小化的動作,畫面會閃一下就是了

    Const SW_MINIMIZE As Integer = 6  
        Declare Function FindWindow Lib "coredll.dll" (ByVal className As Char(), ByVal WindowsName As Char()) As Integer 
        Declare Function ShowWindow Lib "coredll.dll" (ByVal hwnd As IntegerByVal nCmdShow As IntegerAs Boolean 
     
        Private Sub Timer1_Tick(ByVal sender As System.ObjectByVal e As System.EventArgs) Handles Timer1.Tick  
            Dim h As Integer = 0  
            h = FindWindow(Nothing"Form1".ToCharArray)   '已確認過FORM1.TEXT為FORM1,此處的 h 是否跟宣告的 h 重疊?         
            ShowWindow(h, SW_MINIMIZE)  
            Timer1.Enabled = False 
        End Sub 
     
        Private Sub Form1_Load(ByVal sender As System.ObjectByVal e As System.EventArgs) Handles MyBase.Load  
            Timer1.Enabled = True 
        End Sub 

    態度決定一切 ! - blog : http://bauann-makeit.blogspot.com/
    • 已標示為解答 LeonChen 2009年2月6日 上午 07:34
    2009年2月4日 下午 01:01
    版主
  • 用 TIMER 可以把程式最小化了,我用一個晚上的時間測試為何同樣的程式碼放在 Form_Load 裡卻無做動
    原因應該是當 Form_Load 事件發生時 Form1 的實體根本就還沒做成所以根本抓不到 Form1.Text 屬性
    我再去 MSDN 查一下整個實體的運作流程,好累先去睡了明天再研究用送出按鍵方法 感謝 bauann 兄
    2009年2月4日 下午 04:36