2017-08-01 3 views
3

Même si il y a command-line commands commencer (? La plupart) les différents écrans du panneau de configuration dans Windows 10, un scénario spécifique semble échouer:de Windows lancement de processus échoue en silence - ne peut pas lancer les paramètres Bluetooth dans certains scénarios

Si la machine démarre avec Bluetooth désactivé (non désactivé), l'exécution de la commande qui devrait ouvrir l'écran des paramètres Bluetooth ne fait simplement rien. La commande peut être ms-settings: bluetooth, bthprops.cpl ou ms-settings: Bluetooth.

J'ai aussi essayé de lancer directement l'écran de périphériques Bluetooth (en utilisant la commande % windir% \ shell explorer.exe ::: {28803F59-3A75-4058-995F-4EE5503B023C} comme described here), mais en cliquant sur sur les "paramètres Bluetooth" dans cette fenêtre ne fait rien aussi bien.

La seule façon d'accéder directement à l'écran des paramètres Bluetooth sans passer par la fenêtre principale du panneau de commande et sans allumer Bluetooth d'abord, est par un clic droit sur le carreau correspondant dans le Centre d'action de Windows:

Right click on Bluetooth panel in Windows Action Center

Bien que cela semble être un bug au niveau du système d'exploitation, je me demandais s'il y avait un moyen de savoir quand le lancement échoue à partir du code C#. J'ai donc essayé d'utiliser le code suivant:

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 
} 

Le problème est, aucune exception n'a jamais été jeté, et la plupart du temps l'événement Process.Exit n'a jamais été appelé.

En outre, appelez Windows.Devices.Radios.Radio.GetRadiosAsync() retourne une liste vide! Actuellement, la seule solution que j'ai trouvé est d'activer manuellement le Bluetooth - cela ne changerait pas le comportement Process.Start/Exit, mais cela permet de déjouer la commande pour ouvrir directement la fenêtre des paramètres Bluetooth, et pour obtenir la liste des périphériques Bluetooth/Radio de la machine. Pourtant, en éteignant Bluetooth et en redémarrant la machine, le même problème se reproduirait à nouveau.

Des idées pour une solution de contournement basée sur le code?

+0

L'outil approprié pour que le shell affiche ses boîtes de dialogue est [ShellExecuteEx] (https://msdn.microsoft.com/en-us/library/windows/desktop/bb762154.aspx). En prime, cet appel d'API renvoie des codes d'erreur. – IInspectable

+0

'control bthprops.cpl' démarre avec succès (donc vous n'avez pas d'erreurs) lancez' rundll32.exe Shell32.dll, Control_RunDLL bthprops.cpl, 'et quittez sans erreurs. le 'Control_RunDLL' charge' bthprops.cpl' et appelle ['CPlApplet (0, CPL_INIT, 0, 0)'] (https://msdn.microsoft.com/fr-fr/library/windows/desktop/bb787978 (v = vs.85) .aspx). l'état de la requête 'CPlApplet' du service' bthserv' - s'il n'est pas en cours d'exécution - false return et story end. le 'bthprops.cpl' ne veut pas travailler si' bthserv' ne fonctionne pas – RbMm

+0

@RbMm merci! Pourriez-vous partager les outils que vous avez utilisés pour obtenir ce flux? Aussi, en quoi est-ce différent de ce qui se passe lorsqu'on clique sur le Centre d'action? –

Répondre

0

Note - tout cela se basant uniquement sur mes recherches de débogage, rien de tout cela est documenté


je regarde la façon dont la fenêtre BT-paramètres est ouvert par Action Center (Win8.1, gagnant 10):

l'interface IApplicationActivationManager créé et appelé ActivateApplication méthode avec:

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

arguments = L"page=SettingsPagePCSystemBluetooth"

Code

sur C++ peut être regarder comme:

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(); 
} 

le processId (si tout ok) référence à "X:\Windows\ImmersiveControlPanel\SystemSettings.exe" -ServerName:microsoft.windows.immersivecontrolpanel

pour C# - regardez IApplicationActivationManager::ActivateApplication in C#?

les chaînes non documentés partout "windows.immersivecontrolpanel_cw5n1h2txyewy!microsoft.windows.immersivecontrolpanel" et "page=SettingsPagePCSystemBluetooth" et je ne sais pas sont il est "persistent" - mais actuellement il a l'habitude d'ouvrir la page de gestion Bluetooth dans les paramètres du système. comme si.


dans le cas où nous courons control.exe bthprops.cpl - le processus (control.exe) a lancé sans aucune erreur - que vous avez résultat et non une erreur lorsque vous appelez ce code.

puis control.exe bthprops.cpl exec nouveau processus rundll32.exe Shell32.dll,Control_RunDLL bthprops.cpl, et la sortie

l'appel rundll32.dllControl_RunDLLW(HWND_DESKTOP, (HINSTANCE)&__ImageBase, L"bthprops.cpl", SW_SHOWDEFAULT);

nous pouvons et appel direct void WINAPI Control_RunDLLW(HWND hwndParent, HINSTANCE hInst, PCWSTR cplName, int nCmdShow); ce api exporté de shell32.dll

interne Control_RunDLLW charge "bthprops.cpl" (3- rd argument - cplName), trouvez CPlApplet point d'entrée, et envoyez le message CPL_INIT. la bthprops.cpl sur cette vérification des messages sont bthserv est en cours d'exécution par l'intermédiaire OpenService(L"BTHSERV",) + QueryServiceStatus (en fonction BthpIsbluetoothServiceRunning) et si "BTHSERV" ne fonctionne pas - il retourner zéro (code échec)

+0

Veuillez fournir des liens vers la documentation de référence, ou marquer explicitement les constantes respectives et les appels de fonction comme * "inofficial" * et/ou * "non pris en charge" *. – IInspectable

+0

@IInspectable - vous voulez dire 'Control_RunDLLW'? ce n'est pas formel documenté. Cependant, dans cette partie, je n'explique que ce qui se passe lorsque nous exécutons 'control bthprops.cpl' - pourquoi cela ne peut avoir aucun effet visible (si' bthserv' ne fonctionne pas) et aucune erreur n'est renvoyée. à propos de 'windows.immersivecontrolpanel_cw5n1h2txyewy! microsoft.windows.immersivecontrolpanel' - il est bien sûr non documenté. mais j'ai écrit - 'je regarde comment la fenêtre des paramètres BT est ouverte via le Centre de l'Action:' - donc ce n'est que ma recherche de débogage – RbMm