我正在创建一个自定义 WLAN 连接向导,其灵感来自 Windows XP/Server 2003。在其侧边栏上,有一个“更改高级设置”选项(屏幕截图来自系统 WLAN 向导,不是我的),打开适配器属性。在 Windows Vista 和更新版本中,当在网络适配器上单击 RMB 时出现的菜单中单击“属性”时,会执行 ncpa.cpl 相同的操作。这是目标行为。
我尝试在 Microsoft Learn 上挖掘与 Network Configuration Interfaces COM 接口相关的文档,最接近的匹配是 INetCfgComponent::RaisePropertyUi 但它会打开特定的网络 component 设置,这是一个失误 - 它是一个级别 比要求更深。这正是来自 unanwsered 问题 15901907 的代码的作用。
然后我选择搜索未记录的 Windows 界面,并偶然发现了 GUID
{C08956A4-1CD3-11D1-B1C5-00805FC1270E}
,称为 INetConnectionPropertyUi
,HKCR hive 的注册表中缺少该 GUID,但可以通过 CoCreateInstance
访问。我认为使用以下代码会成功(可以在here查看完整文件):
hr = pNetCCPui->AddPages(NULL, PropSheetExCallback, reinterpret_cast<LPARAM>(&pinfo));
if (SUCCEEDED(hr))
{
if (PropertySheetW(&pinfo) < 0)
hr = E_FAIL;
}
但是我立即在
0xC0000005
调用时因 PropertySheetW
(访问冲突)而崩溃。崩溃期间会出现所需的属性表,但完全空白。
今天我想到了通过
ShellExecute
获取所需的窗口,认为可以通过特定的 CLSID 访问它。我离目标行为并不远——我至少到达了适配器状态窗口,但再次错过了——这次比要求的浅一级:
shell:::{7007ACC7-3202-11D1-AAD2-00805FC1270E}\{network adapter GUID}
我通过未回答的(?)问题78393276找到了这种方法,并在超级用户上新移动了问题1840801。
我寻找打开适配器属性对话框的方法,但不是:
SendMessageW
)什么样的解决方案有效:
ShellExecute
将继续上面的 GUID 链到所需的对话框ncpa.cpl
的任何事情看来我会再再回答我的问题。可以通过
ShellExecuteW
方式到达那里:
{
ATL::CStringW cswNetworkAdapterPath = L"";
LPOLESTR lpwszNetConCLSID;
StringFromIID(CLSID_NetworkConnections, &lpwszNetConCLSID);
cswNetworkAdapterPath.Format(L"::%s\\::%s", lpwszNetConCLSID, lpwszAdapterGUID);
ShellExecuteW(NULL, L"properties", cswNetworkAdapterPath, NULL, NULL, SW_SHOWNORMAL);
}
这是一种快速而肮脏的方法,但它确实有效(越不那么肮脏,就越是
CSIDL_CONNECTIONS
方式)。您可能还需要抓住一根线以打开属性表。