Как мне объявить LPCGUID в VB6?

#winapi #vb6

Вопрос:

Я хотел бы использовать RegisterPowerSettingNotification в VB6.

Он ожидает идентификатор GUID в качестве параметра:

 HPOWERNOTIFY RegisterPowerSettingNotification(
  HANDLE  hRecipient,
  LPCGUID PowerSettingGuid,
  DWORD   Flags
);
 

Я не нахожу никаких примеров того, как это сделать в VB6. В частности, я не понимаю, как определить этот идентификатор GUID. Я думаю, это не просто веревочка.

Это то, что я мог придумать до сих пор:

 Private hPowerSrcamp;
Private hBattCapacityamp;
Private hMonitorOnamp;
Private hPowerSchemeamp;

Private Const DEVICE_NOTIFY_WINDOW_HANDLE As Long = 0

Private Sub pInitPower()

    hPowerSrc = RegisterPowerSettingNotification(Me.hWnd, GUID_ACDC_POWER_SOURCE, DEVICE_NOTIFY_WINDOW_HANDLE)

    hBattCapacity = RegisterPowerSettingNotification(Me.hWnd, GUID_BATTERY_PERCENTAGE_REMAINING, DEVICE_NOTIFY_WINDOW_HANDLE)

    hMonitorOn = RegisterPowerSettingNotification(Me.hWnd, GUID_MONITOR_POWER_ON, DEVICE_NOTIFY_WINDOW_HANDLE)

    hPowerScheme = RegisterPowerSettingNotification(Me.hWnd, GUID_POWERSCHEME_PERSONALITY, DEVICE_NOTIFY_WINDOW_HANDLE)

End Sub
 

Как бы я выполнил этот образец, включая объявление API и идентификаторы GUID, и вызвал его?

Спасибо!

Комментарии:

1. docs.microsoft.com/en-us/windows/win32/api/guiddef/. (byval long, byref GUID, byval long) as long .

2. Как использовать GUID в VB6

3. среди авторов vb6, я думаю, не все живы. сообщение об ошибке может быть?

Ответ №1:

В соответствии с тем, как использовать GUID в VB6, попробуйте что-то вроде этого:

 Private hPowerSrcamp;
Private hBattCapacityamp;
Private hMonitorOnamp;
Private hPowerSchemeamp;

Private Const DEVICE_NOTIFY_WINDOW_HANDLE As Long = 0

Private Type GUID
    Data1 As Long
    Data2 As Integer
    Data3 As Integer
    Data4(0 To 7) As Byte
End Type

Private Declare Function CLSIDFromString Lib "ole32" (ByVal lpsz As Long, ByRef clsid As GUID) As Long

Private Declare Function RegisterPowerSettingNotification Lib "user32" (ByVal hRecipient As Long, ByRef PowerSettingGuid As GUID, ByVal Flags As Long) As Long;

Private Sub pInitPower()

    Dim GUID_ACDC_POWER_SOURCE as GUID
    Dim GUID_BATTERY_PERCENTAGE_REMAINING as GUID
    Dim GUID_MONITOR_POWER_ON as GUID
    Dim GUID_POWERSCHEME_PERSONALITY as GUID

    CLSIDFromString StrPtr("{5D3E9A59-E9D5-4B00-A6BD-FF34FF516548}"), GUID_ACDC_POWER_SOURCE
    CLSIDFromString StrPtr("{A7AD8041-B45A-4CAE-87A3-EECBB468A9E1}"), GUID_BATTERY_PERCENTAGE_REMAINING
    CLSIDFromString StrPtr("{02731015-4510-4526-99E6-E5A17EBD1AEA}"), GUID_MONITOR_POWER_ON
    CLSIDFromString StrPtr("{245d8541-3943-4422-b025-13A784F679B7}"), GUID_POWERSCHEME_PERSONALITY

    hPowerSrc = RegisterPowerSettingNotification(Me.hWnd, GUID_ACDC_POWER_SOURCE, DEVICE_NOTIFY_WINDOW_HANDLE)

    hBattCapacity = RegisterPowerSettingNotification(Me.hWnd, GUID_BATTERY_PERCENTAGE_REMAINING, DEVICE_NOTIFY_WINDOW_HANDLE)

    hMonitorOn = RegisterPowerSettingNotification(Me.hWnd, GUID_MONITOR_POWER_ON, DEVICE_NOTIFY_WINDOW_HANDLE)

    hPowerScheme = RegisterPowerSettingNotification(Me.hWnd, GUID_POWERSCHEME_PERSONALITY, DEVICE_NOTIFY_WINDOW_HANDLE)

End Sub
 

Комментарии:

1. Здесь также можно привести веские аргументы ByRef PowerSettingGuid As Any . Затем вы можете передать нулевой указатель или первый элемент байтового или длинного массива по мере необходимости. UDT для GUID-это действительно немного чересчур, но мы все равно склонны это делать. Там больше документации, чем значимости.

2. Спасибо. Я все еще пытаюсь проверить сообщение в окне, чтобы действительно попробовать его. Я опубликовал новый вопрос об этом, потому что я еще не понимаю, как обращаться с сообщением.