我做了一个窗体,想在运行的时候让其自动最小化,然后通过自行设定的快捷键(如Ctrl+K)来让其恢愎原来窗体的大小,要怎么样来实现,请大家帮忙。最好详累一点,我是新手,谢谢!

解决方案 »

  1.   

    这种系统快捷键要用到HOOK~http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=191720
    http://community.csdn.net/Expert/topic/3516/3516338.xml
    窗体大小改WindowState就可以
    比如启动时最小化~Private Sub Form_Load()
        Me.WindowState = 1
    End Sub
      

  2.   

    Private Const MOD_ALT = &H1
    Private Const MOD_CONTROL = &H2
    Private Const MOD_SHIFT = &H4
    Private Const PM_REMOVE = &H1
    Private Const WM_HOTKEY = &H312
    Private Type POINTAPI
        x As Long
        y As Long
    End Type
    Private Type Msg
        hwnd As Long
        Message As Long
        wParam As Long
        lParam As Long
        time As Long
        pt As POINTAPI
    End TypePrivate Declare Function RegisterHotKey Lib "user32" (ByVal hwnd As Long, ByVal id As Long, ByVal fsModifiers As Long, ByVal vk As Long) As Long
    Private Declare Function UnregisterHotKey Lib "user32" (ByVal hwnd As Long, ByVal id As Long) As Long
    Private Declare Function PeekMessage Lib "user32" Alias "PeekMessageA" (lpMsg As Msg, ByVal hwnd As Long, ByVal wMsgFilterMin As Long, ByVal wMsgFilterMax As Long, ByVal wRemoveMsg As Long) As Long
    Private Declare Function WaitMessage Lib "user32" () As Long
    Private Declare Function ShowWindow Lib "user32.dll" (ByVal hwnd As Long, ByVal nCmdShow As Long) As LongPrivate bCancel As Boolean
    Public Sub ProcessMessages()
        Dim Message As Msg
        Do While Not bCancel
            WaitMessage
            If PeekMessage(Message, Me.hwnd, WM_HOTKEY, WM_HOTKEY, PM_REMOVE) Then
                ShowWindow Me.hwnd, 1'恢复显示
            End If
            DoEvents
        Loop
    End SubPrivate Sub Command1_Click()
    Me.Caption = "test"
    End SubPrivate Sub Form_Load()
        Dim ret As Long
        bCancel = False
        ret = RegisterHotKey(Me.hwnd, &HBFFF&, MOD_CONTROL, vbKeyK)
        Show
        ProcessMessages
    End Sub
    Private Sub Form_Unload(Cancel As Integer)
        bCancel = True
        Call UnregisterHotKey(Me.hwnd, &HBFFF&)
    End Sub
      

  3.   

    这里是tztz520提到的热键~http://search.csdn.net/Expert/topic/643/643117.xml
      

  4.   

    '模块的Public Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    Public Declare Function RegisterHotKey Lib "user32" (ByVal hwnd As Long, ByVal id As Long, ByVal fsModifiers As Long, ByVal vk As Long) As Long
    Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
    Public Const GWL_WNDPROC = (-4)
    Public Const MOD_ALT = &H1
    Public Const MOD_CONTROL = &H2
    Public Const MOD_SHIFT = &H4
    Public Const SW_NORMAL = 1
    Public Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long
    Private loldWnd As Long
    Public Const WM_HOTKEY = &H312
    Public lHotKeyId As Long
    Public Declare Function UnregisterHotKey Lib "user32" (ByVal hwnd As Long, ByVal id As Long) As LongPublic Function WindowProc(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
        If Msg = WM_HOTKEY And wParam = lHotKeyId Then          '如果是热键消息,并且ID也正确,一个窗体可能有N多热键,所以要判断ID
            ShowWindow hwnd, SW_NORMAL                          '把窗体设为正常模式
        End If
        WindowProc = CallWindowProc(loldWnd, hwnd, Msg, wParam, lParam)   '执行窗体原有过程
    End Function
    Public Function HookWindow(ByVal hwnd As Long) As Long
        loldWnd = SetWindowLong(hwnd, GWL_WNDPROC, AddressOf WindowProc)  '子类化窗体
    End Function'窗体的
    Private Sub Form_Load()
        lHotKeyId = 1             '把热键的ID设为1 ,msdn上面说可以从&H0000 到&HBFFF
        RegisterHotKey Me.hwnd, 1, MOD_CONTROL Or MOD_ALT, vbKeyO  '把CTRL +ALT+O(不是零)设为热键
        HookWindow Me.hwnd        '子类化窗体
    End Sub'够详细了吧!Private Sub Form_Unload(Cancel As Integer)
        UnregisterHotKey Me.hwnd, lHotKeyId       '设定之后肯定是要取消的嘛!
    End Sub
      

  5.   

    moudle1.basPublic Function Wndproc(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
        If Msg = WM_HOTKEY Then
            If wParam = idHotKey Then
                Dim lp As taLong, i2 As t2Int
                lp.ll = lParam
                LSet i2 = lp
                If (i2.lWord = Modifiers) And i2.hWord = uVirtKey Then
                    Form1.Height = 6660
                    Form1.Top = Form1.Top - 900
        Form1.Shape3.Height = Form1.Height
        
        End If
                End If
        End If
      
        Wndproc = CallWindowProc(preWinProc, hwnd, Msg, wParam, lParam)
        
    End Functionform1Dim rets As LongpreWinProc = GetWindowLong(Me.hwnd, GWL_WNDPROC)rets = SetWindowLong(Me.hwnd, GWL_WNDPROC, AddressOf Wndproc)idHotKey = 1
    Modifiers = MOD_ctrl
    uVirtKey = vbkeyk 'Z键
    rets = RegisterHotKey(Me.hwnd, idHotKey, Modifiers, uVirtKey)