|
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用 · 内置多项VBA编程加强工具 ★ 免费下载 ★ ★ 使用手册★
楼主居然又更新了这么多。
这个接口回调用起来虽然还算方便,但做起来要搞一堆类,老恶心了。
我用CallWindowProc一直没出过问题,最近也换了Excel2021。不过我的CallWindowProc是封装在DLL中。我觉得Excel2021下面出错有可能是使用的问题。
我是将参数转换为Variant使用的,虽然可能效率会降低一些,但通用方便。我的代码Declare Function CallBackProc Lib "user32.dll" Alias "CallWindowProcA" (ByVal lpProc As Long, Optional ByRef Param1 As Any, Optional ByRef Param2 As Any, Optional ByRef Param3 As Any, Optional ByRef Param4 As Any) As Long
Function CallBackFunctionReturnVariant_(ByVal lpProc As Long, Optional ByRef Param1 = 0, Optional ByRef Param2 = 0, Optional ByRef Param3 = 0)
Call CallBackProc(lpProc, CallBackFunctionReturnVariant_, Param1, Param2, Param3)
End Function
以上代码是用于32位Office的。在64位Office下要注意参数的位数。虽然我没装64位Office,但可以在MSDN上查参数类型的原始类型来判断参数位数。https://docs.microsoft.com/en-us ... /windows-data-types
LRESULT CallWindowProcA( [in] WNDPROC lpPrevWndFunc, 64位参数 [in] HWND hWnd, 64位参数,VBA中可用Byref Any类型 [in] UINT Msg, 32位参数,这个只能用byval long。建议回调时这个参数就直接弃用,参数不够用可以用数组或结构的形式传递 [in] WPARAM wParam, 64位参数,VBA中可用Byref Any类型 [in] LPARAM lParam 64位参数,VBA中可用Byref Any类型);
返回值LRESULT 是64位
typedef LONG_PTR LRESULT
#if defined(_WIN64) typedef __int64 LONG_PTR; #else typedef long LONG_PTR;#endif
注意回调函数的原型
LRESULT CALLBACK WNDPROC (HWND, UINT, WPARAM, LPARAM);
VBA中可以这样
LONGPTR WNDPROC (HWND as longptr,byval UINT as long, WPARAM as variant, LPARAM as variant);
如果还出错可以弄个简单的例子发出来,我帮忙研究一下。
|
|