10
votes

Comment démarrer l'application directement dans le plateau système? (.NET C #)

Je veux dire lorsque l'utilisateur commence mon application (EXE). Je veux que cela commence directement dans le plateau système, sans montrer la fenêtre. Comme des logiciels antivirus et des gestionnaires de téléchargement, qui commencent et exécutent dans le plateau système silencieusement.

Je veux le même effet et lorsque l'utilisateur clique sur le bouton "Afficher" du contextMentrip de notificon, seule l'application doit indiquer une interface graphique. < p> J'utilise cela, mais cela ne fonctionne pas xxx

peut être que j'ai besoin d'avoir la fonction principale () dans une autre catégorie qui n'a pas d'interface graphique, mais de notificon & contextmenlustrip dont l'option instantiez la classe de la fenêtre d'interface graphique. Droite?


3 commentaires

Voir aussi cette question - Stackoverflow.com/Questtions/807005/...


Désolé de draguer un vieil sujet. J'ai tout eu sauf une chose majeure. Je comprends que applicy.run () essentiellement abandonner le contrôle (?). Ce que je veux faire, c'est avoir du code faire quelque chose sans interaction utilisateur (disons que les données de traitement et l'écriture dans un fichier). Où ferais-je mettre ce code afin qu'il soit exécutant pendant que le programme est assis dans la barre d'état système?


@BarryDYSert: Application.Run () Démarre la pompe de message Windows. Si vous n'avez pas cet appel quelque part, votre icône de plateau ne fonctionnera pas du tout. Sans rien savoir sur ce que vous essayez réellement de réaliser, je dirais que je dirais de regarder les threads, il suffit de connaître les problèmes de modification de l'interface utilisateur sur les threads autres que celui que Application.Run () était appelé de.


3 Réponses :


3
votes

Vous devez configurer également l'icône de notify.

manuellement ou via la barre d'outils (faites glisser une notification sur votre formulaire) Créez le notificon: P>

Form1 f = new Form1();
Application.Run();        


3 commentaires

En fait, j'ai la configuration de notificon. Donc, je viens d'ajouter la ceci.showintaskbar = false; Mais le problème est que la fenêtre montre un instant puis caché. Je ne veux pas ça.


Découvrez ma solution puis des griffes. Cela résoudra ce problème.


@ChRISF: Hacks sur des hacks ... Ça va toujours apparaître une fenêtre, c'est juste que ça va commencer à minimiser et sera moins susceptible d'être remarqué.



0
votes

Avez-vous créé une application Windows en C #? Vous devez faire glisser un contrôle de notificon sur le formulaire, le contrôle sera placé sous le formulaire car il n'a aucune représentation visuelle sur la forme elle-même.

Ensuite, vous définissez ses propriétés telles que l'icône ...

Essayez celui-ci d'abord ...


0 commentaires

31
votes

La façon dont je configure habituellement quelque chose comme ceci est de modifier le programme pour regarder quelque chose comme ce qui suit: xxx

Utilisation de cela, vous ne le faites pas Besoin de s'inquiéter de la cachette au lieu de la fermeture des formes et de tout le reste des hacks pouvant conduire à ... Vous pouvez également faire un formulaire singleton aussi au lieu d'instantifier un nouveau formulaire à chaque fois que vous cliquez sur le formulaire Afficher le formulaire option. C'est quelque chose à élaborer, pas la solution finale.


11 commentaires

En plus de note, vous devez utiliser un projet d'interface graphique, malgré ce code apparaissant avant que toute interface graphique apparaisse, sinon vous obtiendrez une fenêtre de console qui pire, ce qui est encore pire que le problème d'origine!


Impressionnant!! C'est exactement ce que je cherche. Mais comment puis-je changer l'icon.icon? Je veux mettre mon propre * .ico ici. au lieu d'extraire un.


Nouveau système.Drawing.Con ("C: \ Path \ to \ icon.ico") à partir de la mémoire ou utilisez une ressource (recommandé). Voir cette autre question pour plus de détails sur la procédure à suivre pour créer / utiliser des ressources: Stackoverflow.com/Questtions/90697/...


Wow ... Je suis en train de programmer en C # depuis presque 10 ans et c'est la première fois que je vois une solution à ce problème qui n'est pas un hack sale. Bien fait ;)


Comment définiriez-vous l'élément de menu contextuel par défaut (par exemple pour ouvrir le formulaire sur simple icône click)?


@ mini-moi: il est tard, mais je crois que tous les types de clics (gauche, double, ..) sont tous gérés via des événements sur le notificon. Crochez-vous simplement l'événement concerné et ouvrez votre forme de cette façon.


En fait, je voulais être audacieux. Comme mon antivirus me montre un article audacieux, que j'accède également à un double clic sur l'icône. C'est probablement une question différente sur les menus contextuels, etc.


@ mini-moi: Cela fait longtemps que j'ai regardé C #, mais je que le contextMenu ou le menuem a une propriété par défaut pour les rendre audacieuses comme ça. Câblage de l'action par défaut cependant est toujours à vous de décider, Je pense . Ymmv.


Il semble y avoir un problème avec cette solution: j'utilise un installateur MSI dans mon projet, lors de la désinstallation de l'application doit être automatiquement fermé. Mais lorsque le formulaire n'a jamais été visible (la propriété principale de l'applicationContext n'est pas définie), les événements WM_Close ne peuvent pas être gérés.


@nDreisg Je n'ai aucune réponse pratique depuis que je n'ai pas beaucoup fait le développement de Windows au cours des 10 années que cette réponse a été publiée. Plus précisément, il n'y a pas de fenêtre pour recevoir des événements WM_. Au contraire, votre installateur doit envoyer un message différent / meilleur à l'application. Dans Unix Terre, la solution évidente ici serait un signal de processus. Je ne suis pas sûr de ce que l'analogue est dans Windows Terre. Peut-être un tuyau nommé ou similaire.


Je pense que je n'ai pas vraiment de contrôle sur la fermeture du processus de Windows. J'ai résolu ceci en définissant à nouveau le MainForm et le masquant sur les formulaires charger événement. Exactement comme l'exemple de code dans la question, mais avant de cacher I définir showintaskbar = false;