处理属性页的 Windows 消息

设备属性页提供程序 处理为其设备或设备类创建属性页的请求时,它将返回属性页的对话框过程的地址。 对话框过程必须在获取WM_INITDIALOG消息时初始化属性页,并且必须准备好在获取WM_NOTIFY消息时处理对设备属性的更改。 该过程还可以处理它可能需要的任何其他此类消息,如Microsoft Windows SDK文档中所述。

为了响应WM_INITDIALOG消息,对话框过程初始化属性页中的信息。 此类信息可能包括表示设备的图标、设备的友好名称及其 PnP 设备说明。

SetupDiLoadClassIcon 加载指定设备类的图标,并返回加载的大图标的句柄,该句柄可用于 后续调用 SendDlgItemMessage。 例如:

if (SetupDiLoadClassIcon(
        &pTestPropPageData->DeviceInfoData->ClassGuid, &ClassIcon, 
        NULL)) {
    OldIcon = (HICON)SendDlgItemMessage(
                        hDlg, 
                        IDC_TEST_ICON,
                        STM_SETICON, (WPARAM)ClassIcon, 0);
    if (OldIcon) {
                DestroyIcon(OldIcon);
    }
}

ClassIcon 中返回的句柄可以强制转换为 SendDlgItemMessage 函数所需的 WPARAM。 在示例中,IDC_TEST_ICON标识对话框中接收STM_SETICON消息的控件。 必须在提供程序中定义 IDC_TEST_ICON 的值。 有关操作图标和位图的其他函数,请参阅 设备安装函数。 有关 SendDlgItemMessageDestroyIcon 和在对话框中使用图标的详细信息,请参阅 Windows SDK 文档。

除了表示设备的图标外,典型的设备属性页还包括设备的说明或“友好名称”,并显示设备属性的当前设置。 即插即用 (PnP) 管理器将每个设备的 PnP 属性存储在注册表中。 属性页提供程序可以调用 SetupDiGetDeviceRegistryProperty 来获取任何此类属性的值。 如果特定于设备或类的配置信息也作为安装过程的一部分存储在注册表中,则属性页提供程序可以使用其他 SetupDiXxx 函数提取该信息以供显示。 有关详细信息,请参阅 设备安装函数

当页面上发生某些类型的更改时,属性表会将 WM_NOTIFY 消息发送到对话框过程。 对话框过程应准备好从消息参数中提取通知代码并做出相应的响应。

有关对话框过程可能会遇到的通知(例如PSN_APPLY或PSN_HELP通知)以及该过程应如何处理这些通知的详细信息,请参阅 Windows SDK 文档中的 通知

PSN_APPLY通知

当用户单击“ 确定”、“ 关闭”或“ 应用”时,属性表会发送PSN_APPLY通知消息。 为了响应此消息,对话框过程应验证并应用用户所做的更改。

当它收到PSN_APPLY通知时,提供程序必须执行以下操作:

  1. 如果尚未执行此操作,请获取指向设备安装参数的指针, (SP_DEVINSTALL_PARAMS 设备的结构) 。 通过调用 SetupDiGetDeviceInstallParams,传递在 PROPSHEETPAGE 结构的 lParam 成员引用的区域中传递的已保存的 DeviceInfoSetDeviceInfoData,可以使用此结构。

  2. 确保用户的更改有效。

  3. 如果提供程序允许用户设置需要 Windows 删除并重启设备的属性,则提供程序必须在返回的 SP_DEVINSTALL_PARAMS 结构的 FlagsEx 字段中设置DI_FLAGSEX_PROPCHANGE_PENDING标志。

    但是,如果提供程序可以确保更改不需要停止再重启设备的驱动程序,则无需设置此标志。

  4. 使用已更改的 SP_DEVINSTALL_PARAMS 结构调用 SetupDiSetDeviceInstallParams 以设置新参数。

PSN_RESET通知

当用户单击“ 取消”时,属性表会发送PSN_RESET通知消息。 为了响应此消息,对话框过程应放弃用户所做的任何更改。