Cd opener/closer

Soyez le premier à donner votre avis sur cette source.

Snippet vu 18 039 fois - Téléchargée 33 fois

Contenu du snippet

Ce petit programme tourne en arrière plan, il ouvre le lecteur attribué a une touche.

Exemple:
Shift+F12 Ouvrir le lecteur X:\
F12 Fermer le lecteur X:\

Au premier lancer notepad s'ouvre et vous pouvez changer les lecteurs attribués aux différentes touches. Vous êtes égallement libre de modifier ce fichier plus tard, il se trouve dans: "C:\CDOpenerCloser.ini"

Je vous conseille d'ajouter une référence a ce programme dans:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\
CurrentVersion\Run
Mais c'est a vous de voir.

Source / Exemple :


using System;
//Pour la lecture/écriture du fichier "C:\CDOpenerCloser.ini"
using System.IO;
//Pour: Thread.Sleep();
using System.Threading;
//Pour importer les deux methodes exeternes
using System.Runtime.InteropServices;

namespace CDOpenerCloser
{
	public class CDOpenerCloser
	{
		[STAThread]
		static void Main() 
		{
			char[] F=new char[13];
			beginning:
			//Initialisation du programme
			try
			{
				//Si le fichier "C:\CDOpenerCloser.ini" existe déja on le lit.
				FileStream IniFile= new FileStream("C:\\CDOpenerCloser.ini",FileMode.Open);
				StreamReader IniFileReader = new StreamReader(IniFile);
				string IniText=IniFileReader.ReadToEnd();
				for(int i=1;i<=12;i++)
					F[i]=IniText[IniText.IndexOf("F"+i.ToString()+"->")+i.ToString().Length+3];

				//Important on ferme le flux
				IniFileReader.Close();
				IniFile.Close();
			}
			catch
			{
				//On crée le fichier "C:\CDOpenerCloser.ini"
				FileStream IniFile= new FileStream("C:\\CDOpenerCloser.ini",FileMode.Create);
				StreamWriter IniFileWriter = new StreamWriter(IniFile);

				//Ecriture de l'en tête
				IniFileWriter.WriteLine(new string('*',40));
				IniFileWriter.WriteLine(new string('*',40));
				IniFileWriter.Write("**"+"Wormkey 30.11.2004".PadRight(40-2*2)+"**"+IniFileWriter.NewLine);
				IniFileWriter.Write("**"+"Nothing's impossible".PadRight(40-2*2)+"**"+IniFileWriter.NewLine);
				IniFileWriter.Write("**"+"CD Opener/Closer".PadRight(40-2*2)+"**"+IniFileWriter.NewLine);
				IniFileWriter.Write("**"+"Spécifiez le(s) lecteur(s) CD.".PadRight(40-2*2)+"**"+IniFileWriter.NewLine);
				IniFileWriter.WriteLine(new string('*',40));
				IniFileWriter.WriteLine(new string('*',40));
				IniFileWriter.WriteLine("");

				//Ecriture des drives
				for(int i=1;i<=12;i++)
				{
					IniFileWriter.WriteLine("F"+i.ToString()+"->"+(i==12 ? "X:\\" : "<no-specified drive>"));
					F[i]= i==12 ? 'X' : '<';
				}

				//Ecriture de l'explication finale
				IniFileWriter.WriteLine("");
				IniFileWriter.WriteLine("Une foix notepad fermé vos choix seront pris en compte!");
				IniFileWriter.WriteLine("-Shift+F1-12: Ouvrir le lecteur CD spécifié");
				IniFileWriter.WriteLine("-F1-12: Fermer le lecteur spécifié");

				//Tres important on ferme le flux, pour permettre a notepad d'acceder au fichier
				IniFileWriter.Close();
				IniFile.Close();

				//Lancement de Notepad et attente jusqua sa fermeture (permet a l'utilisateur de paramétrer le prog)
				System.Diagnostics.Process notepad=System.Diagnostics.Process.Start(@"C:\Windows\system32\notepad.exe",@"C:\CDOpenerCloser.ini");
				while(notepad.HasExited==false)
				{
					Thread.Sleep(1000);
				}
				goto beginning;
			}

			//Boucle principale
			do
			{
				//On ne veut pas qu'il monopolise tout le processeur (il doit a peine être visible)
				Thread.Sleep(100);

				//On intercepte les entées au clavier F1-F12 +Shift
				for(int i=1;i<=12;i++)
				{
					if((F[i]>'A' && F[i]<'Z') || (F[i]>'a' && F[i]<'z'))
						if(/*32768=2^15*/(GetAsyncKeyState(110+i+1) & 32768)!=0)//F12
						{
							if(/*32768=2^15*/(GetAsyncKeyState(16) & 32768)!=0 && (GetAsyncKeyState(160) & 32768)!=0)//Shift
							{
								//On ouvre le lecteur
								mciSendString("open "+F[i].ToString()+":\\ type cdaudio alias cdaudio","",0,0);
								mciSendString("Set cdaudio door open wait","",0,0);
								mciSendString("close cdaudio","",0,0);
							}
							else
							{
								//On ferme le lecteur
								mciSendString("open "+F[i].ToString()+":\\ type cdaudio alias cdaudio","",0,0);
								mciSendString("Set cdaudio door closed wait","",0,0);
								mciSendString("close cdaudio","",0,0);
							}
						}
				}

			}
			while(true);
		}

		//Methode nécessaire a l'observation du clavier
		[DllImport("user32.dll")]
		public static extern int GetAsyncKeyState(int uAction);

		//Nécessaire pour envoyer des ordres aux lecteurs CD
		[DllImport("winmm.dll")]
		public static extern long mciSendString(string lptstrcommand,string lptreturnstring,int ureturnlenght,int hwndcallback);
	}
}

Conclusion :


Evitez de lance le prog plusieurs foix en même temps, je ne sais pas encore ce que ca donne...

A voir également

Ajouter un commentaire

Commentaires

Lordvb
Messages postés
57
Date d'inscription
jeudi 13 février 2003
Statut
Membre
Dernière intervention
3 décembre 2004

ok. oué donc le même pb doit se retrouver en java ? si j'ai bien compris du moins ... c'est bête pour le framework .NET :/
sinon la source est pratique :) je pense réutiliser 2 fonctions pour rentrer et sortir mon lecteur CD en fesant un clique sur un bouton merci pour les idées et BruNews pour l'information ;)
BruNews
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
17
Mais y a rien a soumettre, tant que ce sera du framework ou nimporte quelle autre forme de langage interprete, ce sera impossible. Il y a separation complete des espaces memoire entre chaque processus, faudrait donc comme dit plus haut inserer une copie de virtual machine dans chaque processus, ça n'a aucun sens.
Lordvb
Messages postés
57
Date d'inscription
jeudi 13 février 2003
Statut
Membre
Dernière intervention
3 décembre 2004

oué donc en gros ca serait une idée à soumettre pour la prochaine version du framework ... vous en pensez koi ?
cs_coq
Messages postés
6352
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
79
vi
un SetWindowsHookEx ne mettra le hook que pour l'appli elle même
donc là autant passer par les MessageFilter

sinon pour du hook global comme dit BruNews : code natif obligatoire
BruNews
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
17
Et moi je confirme tel que ecrit sur la page que tu cites:
"Global Hook Is Not Supported in .NET Framework".
Code NATIF doit se trouver dans une dll, hors cela point de salut.
Ben oui Crazyht, tu vois le systeme mapper tout le framework dans chaque processus ??? c'est le crash assure. N'oubliez jamais que le C# ne produit pas du code executable, il ne le devient qu'a l'execution apres passage dans le framework.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.