Windows进程启动无提示失败 - 无法在特定情况下

时间:2017-08-01 09:43:40

标签: c# winapi bluetooth windows-10 win32-process

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

如果机器启动蓝牙关闭(未禁用),运行应该打开蓝牙设置屏幕的命令,则什么都不做。该命令可以是 ms-settings:bluetooth bthprops.cpl ms-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行为,但它确实允许成功午餐命令直接打开蓝牙设置窗口,并获得机器的蓝牙/无线电设备列表。不过,当关闭蓝牙并重新启动机器时,同样的问题会再次发生。

基于代码的解决方法的任何想法?

1 个答案:

答案 0 :(得分:0)

注意 - 所有这些仅基于我的调试研究,没有记录在案

我看看BT-settings窗口是如何通过Action Center(win8.1,win 10)打开的:

创建IApplicationActivationManager接口并使用以下方法调用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"字符串没有在任何地方记录,我不确定它是&#34;坚持&#34; - 但目前它曾用于在系统设置中打开管理蓝牙页面。原样。

如果我们运行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 ); shell32.dll

导出的这个api

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