Je veux écrire une petite application qui se trouve dans mon plateau et qui me permet de sélectionner un exécutable et de l'empêcher d'ouvrir. p>
L'UI de l'application est facile à faire à l'aide de Winforms. P>
Ce que je veux savoir, c'est comment détecter si un certain exe a été lâché, puis comment l'arrêter de courir. Je suis sûr que je vais devoir creuser dans des trucs Win32, mais je n'ai aucune expérience dans cette zone, d'où ce post. P>
Il y a une application existante similaire à celle-ci, mais je ne peux pas pour la vie de moi, souvenez-vous de ce qu'on appelle. Il a été écrit dans VB6 et c'est une source ouverte aussi. P>
Toute aide est très appréciée. P>
11 Réponses :
Je me souviens de certaines fonctionnalités Win32 qui aide à résoudre ces scénarios. Si vous utilisez de toute façon .net, ce serait probablement une douleur à mettre en œuvre. J'utiliserais certains des objets de synchronisation croisée croisés (ne savez pas de ma tête lesquels sont croisés) et définiraient un signal. Au démarrage, laissez votre application vérifier si le signal est déjà défini. Si oui, fermez à nouveau l'application. P>
Une des idées, mais pas le meilleur est de regarder les processus de course et de tuer le processus d'exécution nécessaire lors de la découverte, cela peut être fait avec le code C # géré normal. P>
Ouais c'est la méthode que j'utilise jusqu'à présent. Cela fermera l'application après qu'il a été ouvert de sorte que cela me dresse environ 90% là-bas. privé Bool KillProcess (nom de cordes) {foreach (processus CLSProcess in process.getProcesses ()) {if (CLSProcess.processname.ToLower (). StartSwith (nom.tObower ())) {CLSPROCESS.KILL (); retourne vrai; }} retourne faux; } Je me demande simplement si cela vaut la peine de passer le temps à rechercher le crochet Windows (que je ne connais rien de) pour la commodité du blocage de l'application instantanée.
Un crochet Windows devrait résoudre votre problème. Je n'ai jamais essayé cela ... Mais vous devrez faire des API de Pinvoke Win32 pour y parvenir. Crochet Google Win32 et voir. P>
Au lieu d'attendre que l'exécutable s'ouvre, vous pouvez donc la refermer à nouveau, vous pouvez aussi simplement paralyser l'exécutable. P>
Changez quelques-uns des octets de l'en-tête EXE et l'empêchent de tout recommencer. P>
Faites-le simplement de manière à ce que l'effet est réversible. p>
private bool KillProcess(string name)
{
foreach (Process clsProcess in Process.GetProcesses())
{
if (clsProcess.ProcessName.ToLower().StartsWith(name.ToLower()))
{
clsProcess.Kill();
return true;
}
}
return false;
}
yeah this is the method I'm using so far. This will close the app after it's been opened so it gets me about 90% there. I use a timer that checks every 10 seconds. I'm just wondering if it's worth spending the time researching the windows hook (which i know nothing about) for the convenience of instant app blocking.
Those of you who know the Win32 api, is it worth the effort?
internal static class Program
{
private static Mutex m;
[STAThread]
private static void Main()
{
bool flag;
m = new Mutex(true, "ProgramName", out flag);
if (!flag)
{
MessageBox.Show("Another instance is already running.");
}
else
{
//start program
}
}
}
I'm using this in a program, and it works perfectly, and it should be able to change this for your needs.
Mon code fait efficacement la même chose. c'est-à-dire trouver un processus et traiter avec elle.
Oui, mais celles-ci évaluant ainsi tous les processus, avec les miens, vous pouvez simplement avoir une liste de mutiles et vérifier. En outre, ma solution était pour autre chose - empêchant votre propre application d'ouvrir deux fois. J'ai simplement mal compris la question elle-même, en lisant dessus trop vite :)
Plutôt que d'essayer de tuer le processus quand il s'exécute, que diriez-lui de l'arrêter de courir dans la première place?
Changer ce qui se passe lorsque la coquille tente de lancer une application est simple - ajoutez une nouvelle clé de registre à Pour tester cela, j'ai ajouté une clé de registre appelée NotePad.exe Strong> et dans ce domaine Valeur de chaîne REGEDIT4
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\notepad.exe]
"Debugger"="calc.exe"
C'est une excellente méthode Stephen. Je peux ajouter ceci à l'application alors maintenant au lieu d'interrogation toutes les 10 secondes qu'il modifie simplement le registre une fois. Doux.
Quelle est cette Stephen Nutt? est ce code C #? @Stephennutt
Vous pouvez écrire un crochet global. P>
Que sera accroché est moins important que le fait qu'il sera global, et donc, mis en œuvre dans une DLL séparée. Dans cette bibliothèque, vous gérez correctement la fixation à un nouveau module. Si vous détectez le processus en double - tuez-le. P>
Juste un petit ajout à Stephen Nutt's Sinon excellente réponse: p>
Si vous voulez que le programme s'en aille bien, ne faites pas simplement apparaître autre chose dans sa position (CALC.EXE à Stephen's Exemple). Spécifiez la clé: "Debugger" = "NTSD -C Q" P>
Cela invoquera le débogueur de la ligne de commande de NT de NT propre, agréable et facile. L'effet secondaire que j'ai observé est que parfois une fenêtre de commande transitoire apparaît brièvement avec une invite de débogueur uniquement pour disparaître à nouveau dans un instant. P>
Merci pour ça, je me demandais quoi mettre à la place du Calc.exe.
OK, je viens de trouver l'application que je cherchais à la recherche d'origine. P>
C'est ce qu'on appelle la tentatation bloquant et c'est disponible ici P>
Il trouvera tous les exécutables et vous permettront de sélectionner ce qu'il faut bloquer pendant de nombreuses heures. P>
Ce n'est pas parfait, j'aimerais que ce serait automatiquement commencer, alors je n'ai pas besoin de le commencer manuellement, mais en dehors de cela, c'est plutôt bon p>
Pourquoi voulez-vous arrêter l'application de l'ouverture? Et ne serait-il pas préférable de restreindre les autorisations de l'utilisateur afin que l'application ne puisse pas être ouverte?
Oui, j'ai examiné la définition des politiques de groupe mais j'ai découvert que les applications peuvent toujours être laissées à la LMC, donc je dois désactiver cela aussi que je ne veux pas faire.
Non, vous pouvez définir l'ACL sur les fichiers eux-mêmes pour qu'ils ne puissent pas être exécutés.