Cd opener/closer

Soyez le premier à donner votre avis sur cette source.

Snippet vu 17 991 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
-
j'ai une ptite question ...
je vois que tu "captes" les touches taper au clavier, ca marche aussi quand ton prog a pas le focus ? ( ca pourrait me servir pour les impr écran dans des formats spécifiques )
BruNews
Messages postés
21054
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
7 novembre 2014
13 -
Ceci ne capte rien mais lit l'etat du clavier en boucle continue, ideal pour ecrouler les performances d'un systeme, une pure demo de ce qu'il ne faut jamais faire.
Lordvb
Messages postés
57
Date d'inscription
jeudi 13 février 2003
Statut
Membre
Dernière intervention
3 décembre 2004
-
oué en gros il renvoit rien si l'utilisateur appuis pas ... enfin ce que je veux dire c'est que c'est pas la pression sur une touche qui "lance" un processus ... oué en effet ca doit bien manger en ressource si ca scanne en permanance l'état du clavier :/
WormkeyP
Messages postés
20
Date d'inscription
samedi 10 janvier 2004
Statut
Membre
Dernière intervention
30 septembre 2010
-
Réponse a lordvb
Oui mon programme capte les touche lorsqu'il n'a pas le focus. Par contre je ne sais pas si ca fonctionne lorsqu'un autre prog prend le clavier en mode exclusif (je pense a DirectX)

Pour l'écroulement du système, je pens qu'avec 1 appel de fonction (en moyenne) tout les 10ème de seconde on ne risque pas grand chose. Cepandand je suis d'accord qu'utiliser un évenement serait plus "propre". Mais bon je ne conais pas encore cet évenement... (Je veux éviter a tout prix d'avoir a utiliser DirectImput)
Lordvb
Messages postés
57
Date d'inscription
jeudi 13 février 2003
Statut
Membre
Dernière intervention
3 décembre 2004
-
si qq1 connait une solution plus légère (BruNews ?) faudrait la mettre :) ca m'intéresse beaucoup ;)
merci pour la réponse bon programme peut être un peu artisanal mais bon :) j'en aurais jamais fait autant :)

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.