WebCam Bluetooth - Partie 1

Réaliser une Webcam Bluetooth sous Windows Mobile - Partie 1

Introduction

Autrefois simples PDA, les Smart Devices combinent aujourd'hui GSM, GPS, appareil photo, connectivité WiFi, etc. Ils ouvrent la porte à de nouveaux types d'applications toutes plus originales les unes que les autres. L'engouement actuel pour l'iPhone d'Apple ou Android de Google en sont de bons exemples.



Ce tutorial va vous expliquer comment transformer un Pocket PC sous Windows Mobile 5 en webcam Bluetooth. Déposez votre Pocket PC dans un endroit à surveiller et toutes les 30 secondes, celui-ci va prendre une photo et la transmettre à votre ordinateur portable via une liaison sans fil. D'où le nom du projet : SpyCam !



La solution se compose d'une application Windows Mobile serveur tournant sous le Compact Framework .NET 3.5 et d'une application Windows client, elle aussi en .NET. Les fonctions utilisées sont également disponibles dans la version 2.0 du Framework.

La classe CameraCaptureDialog

Première déconvenue. Le CF.NET offre une classe très alléchante baptisée CameraCaptureDialog. Hélas, si cette classe permet bien d'afficher une boîte de dialogue pour prendre une photo, rien n'a été prévu pour la fermer automatiquement ! Plutôt ennuyeux si on veut prendre des photos de manière automatique...

Deux solutions s'offrent à vous pour contourner ce problème : attaquer la caméra nativement via DirectShow ou plus simplement, utiliser la fonction SendMessage() du kernel de Windows pour simuler l'appui du bouton caméra. Pour des raisons évidentes de simplicité, c'est cette seconde méthode que j'ai choisie.

Le principal problème sera donc d'identifier les bons codes et paramètres des messages à envoyer. Visual Studio 2008 nous offre un outil très utile pour résoudre ce problème : RemoteSpy. Démarrez l'outil puis connectez-vous sur votre Pocket PC. La liste des fenêtres ouvertes apparaît, comme le montre la copie d'écran ci-dessous :



Repérez la fenêtre courante via son titre et sélectionnez-la. Cliquez ensuite sur l'icône Messages. Appuyez sur la touche de votre choix et examinez les messages envoyés. Dans l'exemple ci-dessous, nous pouvons utiliser le message WM_KEYDOWN.



Comme nous allons utiliser des fonctions du kernel de Windows Mobile, quelques déclarations de fonctions externes sont nécessaires :

[DllImport("CoreDll")]
public static extern IntPtr FindWindow(
string lpClassName, // class name
string lpWindowName // window name
);

[DllImport("CoreDll")]
public static extern IntPtr SendMessage(
IntPtr hWnd, // handle to destination window
uint Msg, // message
uint wParam, // first message parameter
uint lParam // second message parameter
);

[DllImport("CoreDll")]
public static extern IntPtr GetForegroundWindow();

La fonction ci-dessous sera appelée dans l'événement Tick d'un timer se déclenchant toutes les 30 secondes :

private void takePicture()
{
CameraCaptureDialog ccd = new CameraCaptureDialog();
ccd.Resolution = new Size(640, 480);
ccd.Owner = this;
ccd.Mode = CameraCaptureMode.Still;
ccd.DefaultFileName = "Snapshot.jpg";
ccd.StillQuality = CameraCaptureStillQuality.High;
ccd.InitialDirectory = @"\My Documents\My Pictures";
ccd.Title = "Capture";

timerCapture.Enabled = true;
try
{
ccd.ShowDialog();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}

ccd.Dispose();
}

Une fois la photo prise, un second timer est activé afin de simuler l'appui sur le bouton caméra 5 secondes plus tard. Un handle sur la fenêtre au premier plan est récupéré via la fonction GetForegroundWindow() et le message lui est envoyé.

private void timerCapture_Tick(object sender, EventArgs e)
{
timerCapture.Enabled = false;
IntPtr hwnd = GetForegroundWindow();

SendMessage((IntPtr)hwnd, 0x100, 0xD, 0xc5A0001);
}

Le cas échéant, un second message devra être envoyé pour simuler le bouton OK si une fenêtre de prévisualisation apparaît après la prise de la photo.

A suivre...

Voilà pour les bases de l'application serveur. Celle-ci se contente de prendre des photos et de les stocker. Dans un prochain article, nous verrons comment établir une connexion Bluetooth en C# pour transférer la photo prise vers ordinateur distant.

Commentaires