[FAQ] fr.comp.os.ms-windows.programmation
Dominique.Vaufreydaz@imag.fr (Dominique Vaufreydaz)
Archive-Name: fr/comp/os/faq-winprog
-------- Préambule ------------
Voici une petite mise à jour de la FAQ. J'ai rajouté une bibliographie
faite conjointement par plusieurs contributeurs et mise en forme
par AMcD. Qu'ils en soient remerciés.
En vous remerciant. Bonne lecture et bonne programmation.
Doms.
-------------------------------
Le présent document est un brouillon de début de FAQ pour le forum
"fr.comp.os.ms-windows.programmation". Il ne s'agit pas d'une traduction
des FAQ de forums anglophones, mais d'un résumé des questions les plus
fréquemment posées sur ce forum, ainsi que les réponses données sur ce même
forum.
J'ai mis quelques questions dont je n'ai pas la réponse sous la main. Je
chercherai (un jour, peut-être !), mais si quelqu'un veut m'aider, il est
le bienvenu ;-)
Je ne garantis pas la validité des réponses fournies ; je me suis contenté
de recopier des réponses trouvées sur ce forum. Certaines peuvent être
fausses ou obsolètes.
Préambule : MSDN / WIN32.HLP
Pour pouvoir programmer sous Windows, il me paraît indispensable d'avoir
une référence exhaustive de l'API Win32 (Windows 32 bits). Le moyen
habituel d'obtenir cette référence est de télécharger le fichier WIN32.HLP
(s'il n'est pas fourni avec votre compilateur), ou de vous procurer le MSDN
(Microsoft Development Network) sur CD-ROM ; consultable également en ligne
: http://msdn.microsoft.com .
WIN32.HLP : http://www.cs.virginia.edu/~lcc-win32/
Sous forme de .CHI et .CHM :
ftp://ftp.microsoft.com/developr/PlatformSDK/jan2000/common/help/
Il existe aussi "WindowsNT Win32 API Super Bible",
auteur : Richard J. Simon.
éditeur : "Waite Group Press"
Dans le présent document, la réponse à beaucoup de questions consiste en
un simple nom de fonction (exemple : "RasDial"). C'est à chacun de faire
l'effort d'aller voir dans la documentation comment se servir de la
fonction citée.
Dernier point : je ne parlerai pas ici des MFC (Microsoft Foundation
Class), et ce, pour trois raisons :
1/ Je n'y connais rien
2/ C'est limite hors-sujet AMHA (mais ça se discute)
3/ Quelqu'un l'a fait à ma place : http://LaFaqMfc.com/ :-)
PS : un autre bon site : http://www.codeguru.com/
Sommaire :
[1] Questions d'ordre général
[2] Multimédia : son, vidéo, lecteur de CD
[3] Modem / internet
[4] Ecran et affichages
[5] Clavier / souris / scanner
[6] Gestion des processus
[7] Suis-je hors-sujet?
[8] Fichiers : gestion, formats
[9] Base de registre
[10] Divers
[11] Bibliographie
[1] Questions d'ordre général
* KB Q123456 : que es aquo ?
C'est une référence à la Knowledge Base de Microsoft.
Histoire de faire court : <http://www.edulang.com/kb.php>,
taper le numéro de la question dans la boîte d'édition.
* Ouvrages de référence
Cf la liste à Arnold : <http://minilien.com/?sP7rTO1nVT> ou
<//groups.google.com/groups?as_umsgid=3d4f1b42$0$11805$7a628cd7@news.cl">http://groups.google.com/groups?as_umsgid=3d4f1b42$0$11805$7a628cd7@news.cl
ub-internet.fr>
* Quel langage/compilateur choisir?
* Compilateurs C++ gratuits
LCC-Win32 : http://www.cs.virginia.edu/~lcc-win32/
Borland C++ 5.5 : http://www.borland.fr/download/compilateurs/
[voir aussi
http://www.geocities.com/SiliconValley/Campus/5642/owlnext.html ]
Dev-C++ 4 : http://www.bloodshed.net/devcpp.html
[2] Multimédia : son, vidéo, lecteur de CD
* Ouvrir/fermer le tiroir du lecteur de CD :
DeviceIOControl(...,IOCTL_STORAGE_EJECT_MEDIA,.....)
mciSendString("set cdaudio door open", lpszReturn, sizeof(lpszReturn),
NULL); (closed bien sûr pour le contraire)
http://support.microsoft.com/support/kb/articles/Q168/1/80.ASP
* Lire un son : sndPlaySound
* Lire/enregistrer un son, une vidéo, ... : le plus simple est d'utiliser
les fonctions MCI. Cela qui veut se lancer là-dedans doit commencer par
lire le fichier MMEDIA.HLP [Multimedia API Reference], normalement fourni
avec votre compilateur. Sinon, une version datant du 25/3/97 est disponible
à http://members.xoom.com/lelez/Mmedia.zip
[3] Modem / internet
* Envoi d'e-mails :
Utiliser MAPI (ou Simple MAPI). Cf MAPI.HLP ou la MSDN
Voir aussi Blat : http://www.interlog.com/~tcharron/blat.html
* Problèmes de connexion (à internet)
Pour se connecter : RasDial
Pour savoir si on est connecté : RasEnumConnections
Petite précision d'après hyronn@club-internet.fr :
RasEnumConnections doit connaître la taille (stocké dans dwSize) de la
structure RASCONN passée comme argument... Logiquement, en C(++), on
utiliserait
RASCONN rasConn;
rasConn.dwSize= sizeof (RASCONN);
Seulement, cette opération déclenche une erreur "Invalid Buffer" sous
Windows95/98. Il faut donc mettre
const int RASCONN_dwSize= 412;
rasConn.dwSize= RASCONN_dwSize;
et tout fonctionne. Il semblerait que cette erreur ne soit présente que sous
Win95/98. L'utilisation de cette technique n'altère en rien le
fonctionnement du programme sous WinNT/2000
Pour être averti d'une connexion/déconnexion : RasConnectionNotification
De manière générale, les fonctions de l'API Win32 se rapportant à la
connexion par modem commencent par "Ras".
Pour se déconnecter [code fourni par "Régent" <regent@yahoo.fr>] :
en C++
---------
#include <ras.h>
VOID Disconnect ()
{
RASCONN rc;
DWORD cConnections;
rc.dwSize = sizeof (rc);
RasEnumConnections (&rc, &rc.dwSize, &cConnections);
RasHangUp (rc.hrasconn);
}
en VB :
---------
Type RASCONN
dwsize As Long
hRascon As Long
szentryname As String * 256
szdevicetype As String * 16
szdevicename As String * 32
End Type
Declare Function RasEnumConnections Lib "RasApi32.dll" Alias
"RasEnumConnectionsA" (lpRasCon As Any, lpcb As Long, lpcConnection As Long)
As Long
Declare Function RasHangup Lib "RasApi32.dll" Alias "RasHangUpA" (ByVal
hRascon As Long) As Long
Sub Disconnect ()
Dim RC As RASCONN
RC.dwsize = Len(RC) + 100
RasEnumConnections RC, RC.dwsize, 0&
RasHangup RC.hRascon
End Sub
* Gestion du modem hors internet :
Il faut utiliser TAPI (Telephony Application Programming Interface) - cf
TAPI.HLP. Si ce fichier n'est pas fourni avec votre compilateur, une copie
pas très récente [27/03/1997] est disponible à :
http://members.xoom.com/lelez/Tapi.zip
Pour la télécopie, voir aussi
http://msdn.microsoft.com/library/psdk/fax/mfaxportal_88x1.htm
[4] Ecran
* Connaître la taille de l'écran :
GetSystemMetrics (voir aussi le message WM_DISPLAYCHANGE)
* Faire des fenêtres non rectangulaires : SetWindowRgn.
NB : C'est sans doute faisable directement avec les MFC ou les OWL, mais
c'est beaucoup plus délicat.
Pour les fenetres avec des bordures et des couleurs speciales il faut
traiter les messages Non Client WM_NC*.
voir aussi http://micromeg.free.fr/HowTo.html
* Mettre une icône dans la "traybar" (en bas à droite à côté de l'horloge)
Shell_NotifyIcon
* Mettre une fenêtre au premier plan ou à l'arrière-plan : SetWindowPos
* Afficher des JPEG : cf interface IStream (OleLoadPicture(), Render())
* Changer la résolution de l'écran ou enlever la barre de tâche
pour se mettre en plein écran : http://micromeg.free.fr/HowTo.html
* Comment placer une icône dans le systray (zone de la barre de tâche où
se trouve l'heure, le volume sonore...) :
http://micromeg.free.fr/HowTo.html
* Tout sur les économiseurs d'écran : http://www.wischik.com/scr/
* Comment mettre le curseur à un endroit donné de l'écran dans un programme
console ?
void GotoXY (int X, int Y)
{
HANDLE hStdOut;
COORD coPos;
coPos.X = X; coPos.Y = Y;
hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
if (hStdOut != INVALID_HANDLE_VALUE)
SetConsoleCursorPosition(hStdOut,coPos);
}
[5] Clavier/souris
* Simuler un événement souris/clavier :
mouse_event / keybd_event (API Win32)
* Intercepter des événements souris/clavier : il faut créer un hook local
(pour intercepter les messages à l'intérieur d'une application) ou système
(pour intercepter tous les messages envoyés à toutes les applications).
cf SetWindowsHookEx
[Réponse à étoffer]
* Piloter un scanner : http://www.twain.org/
[6] Gestion de processus
* Comment tuer un processus en connaissant uniquement le HWND de la fenêtre
principale de l'application?
[Merci Christian Astor!]
Pour passer du hWnd au hProcess pour le killer:
- GetWindowThreadProcessId(hWnd, nProcessId);
- hProcess = OpenProcess( PROCESS_ALL_ACCESS, FALSE, nProcessId );
- TerminateProcess( hProcess, 99 );
- CloseHandle(hProcess);
* Lister les processus :
CreateToolhelp32Snapshot()
Process32First()
Process32Next()
<http://groups.google.com/groups?oi=djq&selm=an_650031009>
* Comment détecter si mon application tourne déjà pour ne pas lancer une
deuxième session en Win32?
cf CreateMutex [API Win32]
http://www8.zdnet.com/pcmag/issues/1515/pcmg0084.htm
http://micromeg.free.fr/HowTo.html
Comment lancer une application et attendre qu'elle se termine?
http://micromeg.free.fr/HowTo.html
Comment retrouver la fenêtre principale d'une application dont on a le
"process id" (par exemple lancée avec CreateProcess) ? Comment terminer une
application ?
http://support.microsoft.com/support/kb/articles/Q178/8/93.ASP
[7] Suis-je hors-sujet?
Comment créer un site web? Comment faire telle ou telle chose sur un site web?
cf le forum fr.comp.infosystemes.www.auteurs
Comment faire telle ou telle chose sous Windows 95/98/2K/NT?
Si votre question ne concerne pas explicitement la programmation, elle est
hors-sujet sur ce forum.
Il y a des chances pour que les forums fr.comp.os.ms-windows.win95 et
fr.comp.os.ms-windows.winnt soient plus accueillants ; attention toutefois
à bien lire leur FAQ avant de poster.
Pour plus d'informations : fr.bienvenue ou
http://www.citeweb.net/aminaute/forums/tablefr.html
[8] Fichiers : gestion, formats
SHFileOperation fait pas mal de trucs (copie, déplacement, ...) avec en
option une fenêtre indiquant l'avancement de l'opération.
Sinon, on peut utiliser la méthode habituelle de recherche dans l'API Win32 :
français -> anglais -> API
Déplacer fichier -> Move file -> MoveFile (ou MoveFileEx)
Copier fichier -> Copy file -> CopyFile (ou CopyFileEx)
Effacer fichier -> Delete file -> DeleteFile
etc...
Création de raccourcis (dans le menu démarrer ou ailleurs) :
Utiliser les interfaces IShellLink et IPersistFile.
Un exemple de mon cru à http://www.chez.com/nospam/CreationLiens.cpp
Comment trouver le nom réel d'un répertoire spécial, comme le "menu
démarrer", le répertoire des polices...
http://micromeg.free.fr/HowTo.html
Un exemple : http://www.chez.com/nospam/CreationLiens.cpp
Comment trouver le nom court (ou "nom MS-DOS") d'un fichier (à la
"MESDOC~1") : GetShortPathName [API Win32]
Comment ouvrir une boite de sélection de répertoire pour que
l'utilisateur puisse choisir un répertoire -- Boîte de dialogue "choix d'un
répertoire" (SHBrowseForFolder) :
http://codeguru.earthweb.com/mfc/comments/2820.shtml
http://micromeg.free.fr/HowTo.html
Tout sur les formats de fichiers (fichiers de données, images, sons, etc...)
http://www.wotsit.org/
http://www.dcs.ed.ac.uk/home/mxr/gfx/
http://fileformat.virtualave.net/
Pour les fichiers "de base" (BMP, WAV, ...) voir aussi WIN32.HLP
Exécutable qui s'auto-détruit :
http://www.microsoft.com/msj/defaultframe.asp?page=/msj/0198/win320198.htm
[9] Base de registre
Ajouter/supprimer/modifier des clés : RegCreateKey, RegCreateKeyEx,
RegDeleteKey, RegFlushKey, RegOpenKey, RegOpenKeyEx, RegSetValue,
RegSetValueEx et toutes les fonctions de l'API commençant par Reg.
Paramètres de REGEDIT.EXE
<http://groups.google.com/groups?oi=djq&selm=an_559631632>
[10] Divers
Création d'un AUTORUN.INF :
<http://groups.google.com/groups?oi=djq&selm=an_612302829>
En gros, pour lancer un exécutable, la structure de l'AUTORUN.INF est
celle-ci :
[AUTORUN]
run=machin.exe
icon=icone.ico (facultatif)
Pour lancer autre chose, remplacer run=machin.exe par
shellexecute=machin.truc
Mélanger code 16 bits / 32 bits :
http://support.microsoft.com/support/kb/articles/Q155/7/63.ASP
Accéder au port série : CreateFile [API Win32]
cf aussi http://msdn.microsoft.com/library/techart/msdn_serial.htm
Et enfin (roulement de tambour...) la "polémique" de
fr.comp.os.ms-windows.programmation : peut-on programmer _sérieusement_
sous Windows sans savoir lire l'anglais?
Réponse la plus objective que j'aie réussi à trouver : Rien n'indique que
c'est impossible, mais à ma connaissance personne n'a encore réussi. La
question est donc ouverte ;-)
[11] Bibliographie
AMcD a écrit :
Bon, voici une petite bibliographie actualisée 2005 pour le codeur Windows
Win32/Net. Merci à Aurélien, Arnaud, Olivier, etc.
[Programmation Générale]
- Programming Windows, The Definitive Guide to the Win 32 API (5th Ed), par
Charles Petzold (1998)
[Programmation Avancée]
- Multithreading Applications in Win32, par Jim Beveridge (1996)
- Win32 Programming, par Brent Rector (1997)
- Multithreaded Programming with Win32, par Thuan Pham (1998)
- Programming Applications for Microsoft Windows (4th Ed), par Jeffrey
Richter (2000)
[Programmation Système]
- Undocumented Windows NT, par Prasad Dabak (1999)
- Win32 System Services, par Marshall Brain (2000)
- Windows NT/2000 Native API Reference, par Gary Nebbett (2000)
- Undocumented Windows 2000 Secrets, par Sven Schreiber (2001)
- Win32 System Programming (3rd Ed), par Jonhson Hart (2004)
- Windows Internal (4th Ed), par David Solomon et Mark Russinovich (2005)
[Sécurité, Debugging]
- Programming Windows Security, par Keith Brown (2000)
- Debugging Applications, par John Robbins (2000)
- Programming Server-Side Applications for Microsoft Windows 2000, par
Jeffrey Richter (2000)
- Writing Secure Code (2nd Ed), par Michael Howard (2002)
- Microsoft Windows Security Resource Kit, par Ben Smith (2003)
- Microsoft Windows XP Inside Out (2nd Ed), par Ed Bott (2004)
[Drivers]
- The Windows 2000 Device Driver Book, par Art Baker (1999)
- Developing Windows NT Device Drivers, par Edward Dekker (2000)
- Programming the Microsoft Windows Driver Model (2nd Ed), par Walter Oney
(2002)
[Graphisme]
- Windows Graphics Programming : Win32 GDI and DirectDraw, par Feng Yuan
(2000)
- Introduction to 3D Game Programming with DirectX 9.0, par Franl Luna
(2003)
- Graphics Programming with GDI+ & DirectX, par Alex Polyakov (2005)
[Réseau]
- Network Programming for Microsoft Windows, par Anthony Jones (1999)
[ATL, COM, COM+, DCOM]
- Essential COM, par Don Box (1997)
- Learning DCOM, par Thuan Thai (1999)
- Understanding COM+, par David Platt (1999)
- ATL Internals, par Brent Rector (1999)
- Understanding DCOM, par William Rubin (1998)
[.NET]
- Programming Microsoft .NET, par Jeff Prosise (2002)
- Applied Microsoft .NET Framework Programming, par Jeffrey Richter (2002)
- Introducing Microsoft .Net, par David Platt (2003)
- Programming .NET Components, par Juval Lowy (2003)
- Inside Microsoft Visual Studio .NET 2003, par Marc Young (2003)
[C#]
- Programming Windows with C#, par Charles Petzold (2001)
- Microsoft Visual C# .NET Language Reference, par Microsoft (2002)
- Programming C# (3rd Ed), par Jesse Liberty (2003)
Notes.
- Ne sont mentionnés que des ouvrages encore trouvables.
- Certains existent en français.
Traduit en HTML par faq2html.pl le Wed Nov 3 05:42:13 2010 pour le site Web Usenet-FR.