2015-03-09 2 views
0

J'ai écrit une application de sécurité de pilote WinForms pour une tablette Windows qui va vider l'écran (afficher une fenêtre en haut de l'écran plein vide) quand il détecte que la voiture se déplace à plus de 15km/h (en utilisant les tablettes GPS).Windows 8 .NET problème de mise en forme form.activate a un comportement différent lors de l'exécution avec débogueur

Le logiciel a bien fonctionné sous Windows 7, mais j'ai un peu de mal à le faire fonctionner sous Windows 8. Mon premier défi est d'afficher l'écran vide lorsque le menu de démarrage Metro est actuellement affiché. Donc, si l'utilisateur a le menu Démarrer de Metro affiché et que la voiture commence à rouler> 15 km/h, mon écran vide devrait s'afficher ... Je dois voler l'accent de l'interface de métro et afficher ma fenêtre vide sur le bureau.

Pour tester cela, j'ai écrit une simple application vb.net en 2010. Il avait une forme avec un tir de minuterie toutes les 3 secondes. En cas Tick j'avais le code:

Beep() 
    Me.Activate() 

Quand je courais cela avec le débogueur et appuyé sur la touche Windows pour afficher le menu Démarrer Metro, cela a fonctionné ... L'accent rétablissait sur le bureau (et mon fenêtre). Cependant, lorsque j'ai lancé le programme sans le débogueur et que j'ai fait la même chose, j'ai entendu les bips, mais l'accent n'a jamais été rétabli sur le bureau.

Des idées pour lesquelles le comportement serait différent? Des idées sur la façon dont je réplique le même comportement que lorsque le débogueur est attaché?

J'ai essayé quelques choses comme AppActivate, en définissant le formulaire TopMost, BringToFront mais malheureusement cela n'a pas fonctionné.

La seule solution que j'ai trouvée est d'envoyer une frappe sur un bouton Windows mais cela a d'autres problèmes.

Répondre

0

Windows tente spécifiquement d'empêcher les applications de dérober le premier plan d'autres applications. Voir la documentation SetForegroundWindow pour des commentaires sur ceci et les facteurs qui peuvent laisser une application venir au premier plan (toutes les méthodes que vous essayez essentiellement de descendre à un appel SetForegroundWindow). Notez que l'une des circonstances de blocage explicites est "Le processus de premier plan n'est pas une application moderne ou l'écran de démarrage."

Cela fonctionne pour vous lors du débogage car "Le processus est en cours de débogage" est l'un des cas qui autorise explicitement les privilèges de premier plan. Comme il s'agit d'une chose généralement peu conviviale pour l'utilisateur, il n'y a pas de bonne façon générale de contourner ce comportement et de voler le premier plan. De même, les applications normales ne peuvent pas être exécutées au-dessus des applications Modern ou de l'écran de démarrage.

Il est peut-être préférable de verrouiller le système en appelant la fonction LockWorkStation.

+0

Merci Rob pour votre explication. Je ne pense pas qu'il existe un moyen de tromper Windows en pensant qu'un débogueur est attaché? – searcher