ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
12
返回列表 发新帖
楼主: 阿黑123456

[求助] 32位上能运行的宏程序在64位上出错了

[复制链接]

TA的精华主题

TA的得分主题

发表于 2023-3-17 15:25 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
试了一下,如果就单纯的把Declare改为Declare PtrSafe还会出现这样的错误提示。后面不知道如何改了。
QQ图片20230317152418.png

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-3-17 15:27 来自手机 | 显示全部楼层
ykcbf1100 发表于 2023-3-17 15:25
试了一下,如果就单纯的把Declare改为Declare PtrSafe还会出现这样的错误提示。后面不知道如何改了。

是的,后面很多提示类型不匹配

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-3-17 17:53 | 显示全部楼层
让GPT修改的,可以用!牛!哈哈哈
Option Explicit

#If VBA7 Then
    Private Declare PtrSafe Function FindWindow Lib "user32" _
                                    Alias "FindWindowA" ( _
                                                         ByVal lpClassName As String, _
                                                         ByVal lpWindowName As String) As LongPtr
    Private Declare PtrSafe Function GetWindowLongPtr Lib "user32.dll" _
                                       Alias "GetWindowLongA" ( _
                                                               ByVal hwnd As LongPtr, _
                                                               ByVal nIndex As Long) As LongPtr
    Private Declare PtrSafe Function SetWindowsHookEx Lib "user32" _
                                          Alias "SetWindowsHookExA" ( _
                                                                     ByVal idHook As Long, _
                                                                     ByVal lpfn As LongPtr, _
                                                                     ByVal hmod As LongPtr, _
                                                                     ByVal dwThreadId As Long) As LongPtr
    Private Declare PtrSafe Function CallNextHookEx Lib "user32" ( _
                                                      ByVal hHook As LongPtr, _
                                                      ByVal nCode As Long, _
                                                      ByVal wParam As LongPtr, _
                                                      lParam As Any) As LongPtr
    Private Declare PtrSafe Function UnhookWindowsHookEx Lib "user32" ( _
                                                           ByVal hHook As LongPtr) As LongPtr
    Private Declare PtrSafe Function PostMessage Lib "user32.dll" _
                                     Alias "PostMessageA" ( _
                                                           ByVal hwnd As LongPtr, _
                                                           ByVal wMsg As Long, _
                                                           ByVal wParam As LongPtr, _
                                                           ByVal lParam As LongPtr) As LongPtr
    Private Declare PtrSafe Function WindowFromPoint Lib "user32" ( _
                                                       ByVal xPoint As Long, _
                                                       ByVal yPoint As Long) As LongPtr
    Private Declare PtrSafe Function GetCursorPos Lib "user32.dll" ( _
                                                        ByRef lpPoint As POINTAPI) As LongPtr
#Else
    Private Declare Function FindWindow Lib "user32" _
                                    Alias "FindWindowA" ( _
                                                         ByVal lpClassName As String, _
                                                         ByVal lpWindowName As String) As Long
    Private Declare Function GetWindowLong Lib "user32.dll" _
                                       Alias "GetWindowLongA" ( _
                                                               ByVal hwnd As Long, _
                                                               ByVal nIndex As Long) As Long
    Private Declare Function SetWindowsHookEx Lib "user32" _
                                          Alias "SetWindowsHookExA" ( _
                                                                     ByVal idHook As Long, _
                                                                     ByVal lpfn As Long, _
                                                                     ByVal hmod As Long, _
                                                                     ByVal dwThreadId As Long) As Long
    Private Declare Function CallNextHookEx Lib "user32" ( _
                                                      ByVal hHook As Long, _
                                                      ByVal nCode As Long, _
                                                      ByVal wParam As Long, _
                                                      lParam As Any) As Long
    Private Declare Function UnhookWindowsHookEx Lib "user32" ( _
                                                           ByVal hHook As Long) As Long
    Private Declare Function PostMessage Lib "user32.dll" _
                                     Alias "PostMessageA" ( _
                                                           ByVal hwnd As Long, _
                                                           ByVal wMsg As Long, _
                                                           ByVal wParam As Long, _
                                                           ByVal lParam As Long) As Long
    Private Declare Function WindowFromPoint Lib "user32" ( _
                                                       ByVal xPoint As Long, _
                                                       ByVal yPoint As Long) As Long
    Private Declare Function GetCursorPos Lib "user32.dll" ( _
                                                        ByRef lpPoint As POINTAPI) As Long
#End If

Private Type POINTAPI
    x As Long
    Y As Long
End Type

Private Type MOUSEHOOKSTRUCT
    pt As POINTAPI
    hwnd As Long
    wHitTestCode As Long
    dwExtraInfo As Long
End Type

Private Const WH_MOUSE_LL As Long = 14
Private Const WM_MOUSEWHEEL As Long = &H20A
Private Const HC_ACTION As Long = 0
Private Const GWL_HINSTANCE As Long = (-6)
Private Const WM_KEYDOWN As Long = &H100
Private Const WM_KEYUP As Long = &H101
Private Const VK_UP As Long = &H26
Private Const VK_DOWN As Long = &H28
Private Const WM_LBUTTONDOWN As Long = &H201

Private mLngMouseHook As LongPtr
Private mListBoxHwnd As LongPtr
Private mbHook As Boolean

Public LISTBOX_Post_Flag As Integer
Public LISTBOX_Mouse_Flag As Integer

Sub HookListBoxScroll()
    Dim lngAppInst As LongPtr
    Dim hwndUnderCursor As LongPtr
    Dim tPT As POINTAPI
   
    GetCursorPos tPT
    hwndUnderCursor = WindowFromPoint(tPT.x, tPT.Y)
   
    If mListBoxHwnd <> hwndUnderCursor Then
        UnhookListBoxScroll
        mListBoxHwnd = hwndUnderCursor
        lngAppInst = GetWindowLongPtr(mListBoxHwnd, GWL_HINSTANCE)
        
        PostMessage mListBoxHwnd, WM_LBUTTONDOWN, 0&, 0&
        
        If Not mbHook Then
            mLngMouseHook = SetWindowsHookEx( _
                                             WH_MOUSE_LL, _
                                             AddressOf MouseProc, _
                                             lngAppInst, _
                                             0)
            
            mbHook = mLngMouseHook <> 0
        End If
    End If
End Sub

Sub UnhookListBoxScroll()
    If mbHook Then
        UnhookWindowsHookEx mLngMouseHook
        mLngMouseHook = 0
        mListBoxHwnd = 0
        mbHook = False
    End If
End Sub

Private Function MouseProc( _
                           ByVal nCode As Long, ByVal wParam As Long, _
                           ByRef lParam As MOUSEHOOKSTRUCT) As LongPtr
    On Error GoTo errH    'Resume Next
   
    If (nCode = HC_ACTION) Then
        If WindowFromPoint(lParam.pt.x, lParam.pt.Y) = mListBoxHwnd Then
            If wParam = WM_MOUSEWHEEL Then
                MouseProc = True
               
                If lParam.hwnd > 0 Then
                    If LISTBOX_Post_Flag = 1 And LISTBOX_Mouse_Flag = 1 Then
                        Sheets("Sheet1").ListBox1.TopIndex = Sheets("Sheet1").ListBox1.TopIndex - 1
                    End If
                    
                    If LISTBOX_Post_Flag = 1 And LISTBOX_Mouse_Flag = 2 Then
                        PostMessage mListBoxHwnd, WM_KEYDOWN, VK_UP, 0
                    End If
                    
                Else
                    If LISTBOX_Post_Flag = 1 And LISTBOX_Mouse_Flag = 1 Then
                        Sheets("Sheet1").ListBox1.TopIndex = Sheets("Sheet1").ListBox1.TopIndex + 1
                    End If
                    
                    If LISTBOX_Post_Flag = 1 And LISTBOX_Mouse_Flag = 2 Then
                        PostMessage mListBoxHwnd, WM_KEYDOWN, VK_DOWN, 0
                    End If
                End If
               
                PostMessage mListBoxHwnd, WM_KEYUP, VK_UP, 0
               
                Exit Function
            End If
        Else
            UnhookListBoxScroll
        End If
    End If
   
    MouseProc = CallNextHookEx( _
                               mLngMouseHook, _
                               nCode, _
                               wParam, _
                               ByVal lParam)
   
    Exit Function

errH:
    UnhookListBoxScroll
End Function

TA的精华主题

TA的得分主题

发表于 2023-3-17 19:05 | 显示全部楼层
本帖最后由 wodewan 于 2023-3-21 07:46 编辑

WH_MOUSE_LL As Long = 14  最好也改了,全局的,不卡吗?

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-3-17 20:05 来自手机 | 显示全部楼层
wodewan 发表于 2023-3-17 19:05
WH_MOUSE_LL As Long = 14  最好也改了,全局的,不卡吗?

好像不能滚动了。期望的功能是鼠标处于列表框区域时能随滚轮滚动。

TA的精华主题

TA的得分主题

发表于 2023-3-17 20:44 来自手机 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-9-29 20:27 , Processed in 0.030376 second(s), 7 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表