gpt4 book ai didi

c# - Windows 进程启动静默失败 - 在某些情况下无法启动蓝牙设置

转载 作者:行者123 更新时间:2023-11-30 18:16:53 24 4
gpt4 key购买 nike

即使有 command-line commands 启动(大部分?)Windows 10 中的各种控制面板屏幕,特定情况似乎失败:

如果机器在蓝牙关闭(未禁用)的情况下启动,运行应该打开蓝牙设置屏幕的命令,什么都不做。该命令可以是 ms-settings:bluetoothbthprops.cplms-settings:Bluetooth

我还尝试直接启动蓝牙设备屏幕(使用命令 %windir%\explorer.exe shell:::{28803F59-3A75-4058-995F-4EE5503B023C} 作为 described here ),但在此窗口中单击“蓝牙设置”也没有任何反应。

无需通过主控制面板窗口且无需先打开蓝牙即可直接进入蓝牙设置屏幕的唯一方法是右键单击 Windows 操作中心中的相关磁贴:

Right click on Bluetooth panel in Windows Action Center

虽然这看起来像是操作系统级别的错误,但我想知道是否有任何方法可以从 C# 代码中知道何时启动失败。所以我尝试使用以下代码:

try
{
var process = new Process();
process.StartInfo.FileName = "control";
process.StartInfo.Arguments = "bthprops.cpl";
process.Exited += (s, e) =>
{
if (process.ExitCode != 0)
{
TurnOnBt();
}
};
var res = process.Start();
if (!res)
{
TurnOnBt();
}
}
catch (System.Exception ex)
{
int test = 6; // just for breakpoint
}

问题是,从未抛出任何异常,而且大多数时候从未调用 Process.Exit 事件。

此外,调用 Windows.Devices.Radios.Radio.GetRadiosAsync() 会返回一个空列表!

目前我找到的唯一解决方案是手动打开蓝牙 - 它不会改变 Process.Start/Exit 行为,但它确实允许成功执行命令以直接打开蓝牙设置窗口,并获得机器的蓝牙/ radio 设备列表。然而,当关闭蓝牙并重新启动机器时,同样的问题会再次出现。

对于基于代码的解决方法有什么想法吗?

最佳答案

注意 - 所有这些仅基于我的调试研究,没有记录任何内容


我看看如何通过操作中心打开 BT 设置窗口(win8.1,win 10):

IApplicationActivationManager接口(interface)创建并调用 ActivateApplication方法:

appUserModelId = L"windows.immersivecontrolpanel_cw5n1h2txyewy!microsoft.windows.immersivecontrolpanel"

参数 = L"page=SettingsPagePCSystemBluetooth"

c++ 上的代码可能如下所示:

if (0 <= CoInitialize(0))
{
IApplicationActivationManager* pAppAct;
if (0 <= CoCreateInstance(__uuidof(ApplicationActivationManager), 0, CLSCTX_ALL, IID_PPV_ARGS(&pAppAct)))
{
ULONG dwProcessId;
pAppAct->ActivateApplication(
L"windows.immersivecontrolpanel_cw5n1h2txyewy!microsoft.windows.immersivecontrolpanel",
L"page=SettingsPagePCSystemBluetooth",
AO_NONE ,
&dwProcessId);
pAppAct->Release();
}
CoUninitialize();
}

processId(如果一切正常)引用 "X:\Windows\ImmersiveControlPanel\SystemSettings.exe"-ServerName:microsoft.windows.immersivecontrolpanel

c# - 看IApplicationActivationManager::ActivateApplication in C#?

"windows.immersivecontrolpanel_cw5n1h2txyewy!microsoft.windows.immersivecontrolpanel""page=SettingsPagePCSystemBluetooth" 字符串在任何地方都没有记录,我不确定它是否“持久”-但目前它用于在系统设置中打开管理蓝牙页面。原样。


如果我们运行 control.exe bthprops.cpl - 进程 ( control.exe ) 启动时没有任何错误 - 结果你并没有得到任何错误,当你调用此代码。

然后 control.exe bthprops.cpl 执行新进程 rundll32.exe Shell32.dll,Control_RunDLL bthprops.cpl, 并退出

rundll32.dll调用Control_RunDLLW(HWND_DESKTOP, (HINSTANCE)&__ImageBase, L"bthprops.cpl", SW_SHOWDEFAULT);

我们可以直接调用 void WINAPI Control_RunDLLW(HWND hwndParent, HINSTANCE hInst, PCWSTR cplName, int nCmdShow ); 这个 api 从 shell32.dll 导出

在内部 Control_RunDLLW 加载 "bthprops.cpl"(第 3 个参数 - cplName),找到 CPlApplet入口点,然后发送 CPL_INIT信息。此消息检查中的 bthprops.cplbthserv 正在通过 OpenService(L"BTHSERV", ) + QueryServiceStatus 运行>(在函数 BthpIsbluetoothServiceRunning 中)并且如果 “BTHSERV” 未运行 - 它返回零(失败代码)

关于c# - Windows 进程启动静默失败 - 在某些情况下无法启动蓝牙设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45434373/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com