下列代码无法实现预期效果,请分析并修改:Private Declare PtrSafe Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long Const WM_APPCOMMAND = &H319 Const APPCOMMAND_VOLUME_UP = &HA Const APPCOMMAND_VOLUME_DOWN = &H9 Const APPCOMMAND_VOLUME_MUTE = &H8 Const HWND_BROADCAST = &HFFFF& Public Sub SetSystemVolume(ByVal level As Integer) Dim command As Long command = ((level And &HFFFF&) Or ((APPCOMMAND_VOLUME_UP * &H10000) And &HFFFF0000)) PostMessage HWND_BROADCAST, WM_APPCOMMAND, 0, ByVal command End Sub Public Sub MuteSystemVolume() PostMessage HWND_BROADCAST, WM_APPCOMMAND, 0, ByVal (APPCOMMAND_VOLUME_MUTE * &H10000) End Sub
这段VBA代码在64位的Windows操作系统上无法使用,因为Declare语句中的PtrSafe关键字只在32位的VBA中有效。正确的代码如下:
Private Declare PtrSafe Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hWnd As LongPtr, ByVal wMsg As Long, ByVal wParam As LongPtr, lParam As Any) As LongPtr Const WM_APPCOMMAND = &H319 Const APPCOMMAND_VOLUME_UP = &HA Const APPCOMMAND_VOLUME_DOWN = &H9 Const APPCOMMAND_VOLUME_MUTE = &H8 Const HWND_BROADCAST As LongPtr = &HFFFF&
Public Sub SetSystemVolume(ByVal level As Integer) Dim command As LongPtr command = ((level And &HFFFF&) Or ((APPCOMMAND_VOLUME_UP * &H10000) And &HFFFF0000)) PostMessage HWND_BROADCAST, WM_APPCOMMAND, 0, ByVal command End Sub
Public Sub MuteSystemVolume() PostMessage HWND_BROADCAST, WM_APPCOMMAND, 0, ByVal (APPCOMMAND_VOLUME_MUTE * &H10000) End Sub
修改后的代码在Declare语句中使用了LongPtr类型,可以在32位和64位的Windows操作系统上运行。同时,也对代码中的常量进行了类型声明,以提高代码的可读性。
相关推荐


















