2017-08-01 251 views
3

即使有command-line commands开始(?大部分的)各种控制面板屏幕,在Windows 10,一个特定的场景似乎失败:Windows进程启动静静地失败 - 在某些情况下无法启动蓝牙设置

如果机器在关闭蓝牙(未禁用)的情况下启动,则运行应打开蓝牙设置屏幕的命令不会执行任何操作。该命令可以是毫秒设置:蓝牙,bthprops.cpl毫秒设置:蓝牙

我也试过直接启动蓝牙设备屏幕(使用命令%WINDIR%\ explorer.exe的外壳::: {28803F59-3A75-4058-995F-4EE5503B023C}described here),但点击在这个窗口中的“蓝牙设置”也没有任何作用。

直接获得蓝牙设置屏幕,而无需通过主控制面板窗口,而无需首先打开蓝牙去的唯一途径,是通过右键单击在Windows操作中心的相关瓦:

Right click on Bluetooth panel in Windows Action Center

尽管这看起来像是操作系统级别的bug,但我想知道是否有任何方法可以知道在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行为,但它确实允许成功地午餐命令以直接打开蓝牙设置窗口,并且获取机器的蓝牙/无线电设备列表。但是,当关闭蓝牙并重新启动机器时,同样的问题会再次发生。

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

+0

适当的工具具有壳显示其对话框是[的ShellExecuteEx]( https://msdn.microsoft.com/en-us/library/windows/desktop/bb762154.aspx)。作为额外的好处,此API调用返回错误代码。 – IInspectable

+0

'控制bthprops.cpl'成功启动(所以你并没有得到任何错误)启动'rundll32.exe Shell32.dll,Control_RunDLL bthprops.cpl,'并且无错地退出。 'Control_RunDLL'加载'bthprops.cpl'并调用['CPlApplet(0,CPL_INIT,0,0)'](https://msdn.microsoft.com/en-us/library/windows/desktop/bb787978(v = vs.85)的.aspx)。服务'bthserv'的'CPlApplet'查询状态 - 如果没有运行 - 返回false和故事结束。如果'bthserv'没有运行,'bthprops.cpl'不需要工作 – RbMm

+0

@RbMm谢谢!你能分享一下你用来获得流量的工具吗?此外,与点击操作中心时发生的情况有何不同? –

回答

0

注 - 这一切只是基于我的调试研究,从这个没有什么记载


我看BT-设置窗口是如何通过行动中心开放(win8的。1,赢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(如果一切ok)参考"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 EXEC新工艺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- rd参数 - cplName),找到CPlApplet入口点,并发送CPL_INIT消息。在此消息检查的bthprops.cplbthserv经由OpenService(L"BTHSERV",) + QueryServiceStatus运行(在功能BthpIsbluetoothServiceRunning),并且如果"BTHSERV"没有运行 - 它返回零(故障代码)

+0

请提供指向参考文档的链接,或将相应的常量和函数调用明确标记为*“inofficial”*和/或*“unsupported”*。 – IInspectable

+0

@IInspectable - 你的意思是'Control_RunDLLW'?它没有正式记录。然而在这一部分,我只解释当我们运行'control bthprops.cpl'时会发生什么 - 为什么这可能没有可见的效果(如果'bthserv'没有运行)并且没有错误返回。关于'windows.immersivecontrolpanel_cw5n1h2txyewy!microsoft.windows.immersivecontrolpanel' - 它当然也没有记录。但我写道 - “我看看BT设置窗口是如何通过操作中心打开的: - 所以这只是我的调试研究 – RbMm