【问题标题】:Minimize Userform 32bit to 64bit solution最小化用户表单 32 位到 64 位解决方案
【发布时间】:2014-10-20 14:31:27
【问题描述】:

我想帮助我编写适用于 Windows 7 64 位的代码。 目前,对于windows 7 32bit,我正在使用下面的代码,它在用户窗体上显示最小化/最大化按钮并禁用最大化按钮。 有64位解决方案吗? 我可以以某种方式控制我的宏,以便识别系统 Windows 版本吗?

Option Explicit
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As         String, ByVal lpWindowName As String) As Long
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long,     ByVal nIndex As Long) As Long
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function DrawMenuBar Lib "user32" (ByVal hWnd As Long) As Long
Private Declare Function ShowWindow Lib "user32" (ByVal hWnd As Long, ByVal nCmdShow As Long) As Long

Private Const GWL_STYLE As Long = (-16)
Private Const WS_SYSMENU As Long = &H80000
Private Const WS_MINIMIZEBOX As Long = &H20000
Private Const WS_MAXIMIZEBOX As Long = &H10000
Private Const SW_SHOWMAXIMIZED = 3

Private Sub UserForm_Activate()
Dim lFormHandle As Long, lStyle As Long
lFormHandle = FindWindow("ThunderDFrame", ReportOutput.Caption)
lStyle = GetWindowLong(lFormHandle, GWL_STYLE)
lStyle = lStyle Or WS_SYSMENU
lStyle = lStyle Or WS_MINIMIZEBOX
SetWindowLong lFormHandle, GWL_STYLE, (lStyle)
DrawMenuBar lFormHandle

End Sub

提前致谢!

【问题讨论】:

标签: vba 64-bit


【解决方案1】:

您必须在每个 Declare 语句“Declare PrtSafe”之后添加 PtrSafe 子句,并更改“longPtr”的所有“long”类型

那么它应该可以在 32 位和 64 位版本中工作。

【讨论】:

    【解决方案2】:

    这是针对 32 位和 64 位 office 以及 windows 64 位和 32 位的完整解决方案。

    Option Explicit
    'API functions
    #If VBA7 Then
    
        #If Win64 Then
            Private Declare PtrSafe Function GetWindowLongPtr Lib "user32" Alias "GetWindowLongPtrA" _
                (ByVal hWnd As LongPtr, _
                 ByVal nIndex As Long _
                ) As LongPtr
        #Else
            Private Declare PtrSafe Function GetWindowLongPtr Lib "user32" Alias "GetWindowLongA" _
                (ByVal hWnd As LongPtr, _
                 ByVal nIndex As Long _
                ) As LongPtr
        #End If
    
        #If Win64 Then
            Private Declare PtrSafe Function SetWindowLongPtr Lib "user32" Alias "SetWindowLongPtrA" _
                (ByVal hWnd As LongPtr, _
                 ByVal nIndex As Long, _
                 ByVal dwNewLong As LongPtr _
                ) As LongPtr
        #Else
            Private Declare PtrSafe Function SetWindowLongPtr Lib "user32" Alias "SetWindowLongA" _
                (ByVal hWnd As LongPtr, _
                 ByVal nIndex As Long, _
                 ByVal dwNewLong As LongPtr _
                ) As LongPtr
        #End If
    
        Private Declare PtrSafe Function SetWindowPos Lib "user32" _
            (ByVal hWnd As LongPtr, _
             ByVal hWndInsertAfter As LongPtr, _
             ByVal X As Long, ByVal Y As Long, _
             ByVal cx As Long, ByVal cy As Long, _
             ByVal wFlags As Long _
            ) As LongPtr
        Private Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" _
            (ByVal lpClassName As String, _
             ByVal lpWindowName As String _
            ) As LongPtr
        Private Declare PtrSafe Function GetActiveWindow Lib "user32.dll" () As Long
        Private Declare PtrSafe Function SendMessage Lib "user32" Alias "SendMessageA" _
            (ByVal hWnd As LongPtr, _
             ByVal wMsg As Long, _
             ByVal wParam As Long, _
             lParam As Any _
            ) As LongPtr
        Private Declare PtrSafe Function DrawMenuBar Lib "user32" _
            (ByVal hWnd As LongPtr) As LongPtr
    
    #Else
    
        Private Declare Function GetWindowLongPtr Lib "user32" Alias "GetWindowLongA" _
            (ByVal hWnd As Long, _
             ByVal nIndex As Long _
            ) As Long
        Private Declare Function SetWindowLongPtr Lib "user32" Alias "SetWindowLongA" _
            (ByVal hWnd As Long, _
             ByVal nIndex As Long, _
             ByVal dwNewLong As Long _
            ) As Long
        Private Declare Function SetWindowPos Lib "user32" _
            (ByVal hWnd As Long, _
             ByVal hWndInsertAfter As Long, _
             ByVal X As Long, ByVal Y As Long, _
             ByVal cx As Long, ByVal cy As Long, _
             ByVal wFlags As Long _
            ) As Long
        Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
            (ByVal lpClassName As String, _
             ByVal lpWindowName As String _
            ) As Long
        Private Declare Function GetActiveWindow Lib "user32.dll" () As Long
        Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
            (ByVal hWnd As Long, _
             ByVal wMsg As Long, _
             ByVal wParam As Long, _
             lParam As Any _
            ) As Long
        Private Declare Function DrawMenuBar Lib "user32" _
            (ByVal hWnd As Long) As Long
    
    #End If
    
    'Constants
    Private Const SWP_NOMOVE = &H2
    Private Const SWP_NOSIZE = &H1
    Private Const GWL_EXSTYLE = (-20)
    Private Const HWND_TOP = 0
    Private Const SWP_NOACTIVATE = &H10
    Private Const SWP_HIDEWINDOW = &H80
    Private Const SWP_SHOWWINDOW = &H40
    Private Const WS_EX_APPWINDOW = &H40000
    Private Const GWL_STYLE = (-16)
    Private Const WS_MINIMIZEBOX = &H20000
    Private Const SWP_FRAMECHANGED = &H20
    Private Const WM_SETICON = &H80
    Private Const ICON_SMALL = 0&
    Private Const ICON_BIG = 1&
    
    Sub AddIcon(myForm)
    'Add an icon on the titlebar
        #If VBA7 Then
            Dim hWnd As LongPtr
            Dim lngRet As LongPtr
        #Else
            Dim hWnd As Long
            Dim lngRet As Long
        #End If
    
        Dim hIcon As Long
        hIcon = Sheet1.Image1.Picture.Handle
        hWnd = FindWindow(vbNullString, myForm.Caption)
        lngRet = SendMessage(hWnd, WM_SETICON, ICON_SMALL, ByVal hIcon)
        lngRet = SendMessage(hWnd, WM_SETICON, ICON_BIG, ByVal hIcon)
        lngRet = DrawMenuBar(hWnd)
    End Sub
    
     Sub AddMinimizeButton()
    'Add a Minimize button to Userform
        #If VBA7 Then
            Dim hWnd As LongPtr
        #Else
            Dim hWnd As Long
        #End If
    
        hWnd = GetActiveWindow
        Call SetWindowLongPtr(hWnd, GWL_STYLE, _
                           GetWindowLongPtr(hWnd, GWL_STYLE) Or _
                           WS_MINIMIZEBOX)
        Call SetWindowPos(hWnd, 0, 0, 0, 0, 0, _
                          SWP_FRAMECHANGED Or _
                          SWP_NOMOVE Or _
                          SWP_NOSIZE)
    End Sub
    
     Sub AppTasklist(myForm)
    'Add this userform into the Task bar
        #If VBA7 Then
            Dim WStyle As LongPtr
            Dim Result As LongPtr
            Dim hWnd As LongPtr
        #Else
            Dim WStyle As Long
            Dim Result As Long
            Dim hWnd As Long
        #End If
    
        hWnd = FindWindow(vbNullString, myForm.Caption)
        WStyle = GetWindowLongPtr(hWnd, GWL_EXSTYLE)
        WStyle = WStyle Or WS_EX_APPWINDOW
        Result = SetWindowPos(hWnd, HWND_TOP, 0, 0, 0, 0, _
                              SWP_NOMOVE Or _
                              SWP_NOSIZE Or _
                              SWP_NOACTIVATE Or _
                              SWP_HIDEWINDOW)
        Result = SetWindowLongPtr(hWnd, GWL_EXSTYLE, WStyle)
        Result = SetWindowPos(hWnd, HWND_TOP, 0, 0, 0, 0, _
                              SWP_NOMOVE Or _
                              SWP_NOSIZE Or _
                              SWP_NOACTIVATE Or _
                              SWP_SHOWWINDOW)
    End Sub
    

    我们在表单代码窗口中添加此代码

    Private Sub CommandButton1_Click()
    Application.Visible = 1
    End Sub
    
    Private Sub UserForm_Activate()
        Application.Visible = 0
        AddIcon Me   'Add an icon on the titlebar
        AddMinimizeButton   'Add a Minimize button to Userform
        AppTasklist Me    'Add this userform into the Task bar
    End Sub
    
    Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    Application.Visible = 1
    End Sub
    

    最后这是我频道的视频 https://www.youtube.com/watch?v=E01Giu8-o0o 我最诚挚的问候 硕士

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-24
      • 2012-07-15
      • 1970-01-01
      • 2011-01-28
      • 1970-01-01
      • 2013-01-22
      • 1970-01-01
      • 2010-09-13
      相关资源
      最近更新 更多