2017-08-01 94 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

相關問題