Windows API 在子函数中 [VBA]
Windows API in a Sub Function [VBA]
我是 VBA 的新手,因此如果我的问题很愚蠢,请提前原谅。也就是说,我有以下 Windows API:
Private Declare PtrSafe Function IsIconic Lib "user32" (ByVal hWnd As LongPtr) As Integer
在我们声明 API 的模块中,我有以下功能:
Function IsMinimized(hWndAccessApp As Long) As Boolean
IsMinimized = IsIconic(hWndAccessApp) * -1
End Function
除此之外,我还有一个表单,它有一个按钮和该按钮上的一个点击事件,如下所示:
Private Sub btn_one_Click()
Dim test As Boolean
test = IsMinimized(hWndAccessApp)
MsgBox test
End Sub
一切正常。但是,我想知道是否有一种方法可以跳过模块内的函数并直接从与表单内按钮关联的 Private Sub 调用“IsIconic”API?
a) 无法避免 API 函数的声明语句。
b) 您已将 IsIconic
声明定义为 Private
,因此它仅在该模块中已知。如果 btn_one_Click
的代码不在该模块中,则它无法访问该函数 - 但这与成为 API 函数无关。只需删除 Private
-关键字,您就可以从“任何地方”访问它。
c) 正如评论中已经提到的那样,我认为使用隐藏 API 调用细节的包装函数是个好主意(以及返回的整数值的转换变成一个布尔值)。
d) 使用 IsIconic(hWndAccessApp) * -1
将整数值 1 转换为布尔值对我来说很脏。为了避免计算得到布尔值,我建议使用
IsMinimized = (IsIconic(hWndAccessApp) <> 0) ' Or = 1
在几乎所有情况下,您都应该忘记布尔值存储为 0 和 -1 以表示 False 和 True 的事实。让 VBA 为您完成从 1 到 True 的转换。
我是 VBA 的新手,因此如果我的问题很愚蠢,请提前原谅。也就是说,我有以下 Windows API:
Private Declare PtrSafe Function IsIconic Lib "user32" (ByVal hWnd As LongPtr) As Integer
在我们声明 API 的模块中,我有以下功能:
Function IsMinimized(hWndAccessApp As Long) As Boolean
IsMinimized = IsIconic(hWndAccessApp) * -1
End Function
除此之外,我还有一个表单,它有一个按钮和该按钮上的一个点击事件,如下所示:
Private Sub btn_one_Click()
Dim test As Boolean
test = IsMinimized(hWndAccessApp)
MsgBox test
End Sub
一切正常。但是,我想知道是否有一种方法可以跳过模块内的函数并直接从与表单内按钮关联的 Private Sub 调用“IsIconic”API?
a) 无法避免 API 函数的声明语句。
b) 您已将 IsIconic
声明定义为 Private
,因此它仅在该模块中已知。如果 btn_one_Click
的代码不在该模块中,则它无法访问该函数 - 但这与成为 API 函数无关。只需删除 Private
-关键字,您就可以从“任何地方”访问它。
c) 正如评论中已经提到的那样,我认为使用隐藏 API 调用细节的包装函数是个好主意(以及返回的整数值的转换变成一个布尔值)。
d) 使用 IsIconic(hWndAccessApp) * -1
将整数值 1 转换为布尔值对我来说很脏。为了避免计算得到布尔值,我建议使用
IsMinimized = (IsIconic(hWndAccessApp) <> 0) ' Or = 1
在几乎所有情况下,您都应该忘记布尔值存储为 0 和 -1 以表示 False 和 True 的事实。让 VBA 为您完成从 1 到 True 的转换。