OVH Cloud OVH Cloud

ReadConsole + TAB

4 réponses
Avatar
gilles
Bonjour,

Dans une application CUI développée sous XP avec MSVC6, j'utilise la
fonction ReadConsole en mode ENABLE_LINE_INPUT pour la lecture de
commandes saisies par l'utilisateur. Grâce à cette fonction et à ce mode
de fonctionnement, je bénéficie automatiquement et sans effort d'un
invite de commandes ainsi que du support des séquences "doskey" (i.e
historique, rappel de commandes, etc ...). Maintenant, je souhaiterai
détecter la touche TAB pour accomplir des actions spécifiques comme le
fait CMD.EXE pour l'auto-completion des fichiers/dossiers. Est-ce
possible avec la fonction ReadConsole en mode ENABLE_LINE_INPUT sachant
que la fonction ne retourne qu'après la pression de la touche ENTREE ?
Y-a t-il un moyen de sortir de la fonction également avec la touche TAB
et en être informé ?

Merci par avance.

4 réponses

Avatar
Christian ASTOR
gilles wrote:

Dans une application CUI développée sous XP avec MSVC6, j'utilise la
fonction ReadConsole en mode ENABLE_LINE_INPUT pour la lecture de
commandes saisies par l'utilisateur. Grâce à cette fonction et à ce mode
de fonctionnement, je bénéficie automatiquement et sans effort d'un
invite de commandes ainsi que du support des séquences "doskey" (i.e
historique, rappel de commandes, etc ...). Maintenant, je souhaiterai
détecter la touche TAB pour accomplir des actions spécifiques comme le
fait CMD.EXE pour l'auto-completion des fichiers/dossiers.



CMD.EXE fait une boucle sur ReadConsole() en testant le CR pour quitter
la boucle et la touche de completion (lue ds la registry
("CompletionChar") et si "EnableExtensions" est à 1) en utilisant
CONSOLE_READCONSOLE_CONTROL (dwCtrlWakeupMask)
Avatar
gilles
"Christian ASTOR" a écrit dans le message
de news:45bb5c18$0$21144$
| gilles wrote:
|
|| Dans une application CUI développée sous XP avec MSVC6, j'utilise la
|| fonction ReadConsole en mode ENABLE_LINE_INPUT pour la lecture de
|| commandes saisies par l'utilisateur. Grâce à cette fonction et à ce
|| mode de fonctionnement, je bénéficie automatiquement et sans effort
|| d'un invite de commandes ainsi que du support des séquences "doskey"
|| (i.e historique, rappel de commandes, etc ...). Maintenant, je
|| souhaiterai détecter la touche TAB pour accomplir des actions
|| spécifiques comme le fait CMD.EXE pour l'auto-completion des
|| fichiers/dossiers.
|
| CMD.EXE fait une boucle sur ReadConsole() en testant le CR pour
| quitter la boucle et la touche de completion (lue ds la registry
| ("CompletionChar") et si "EnableExtensions" est à 1) en utilisant
| CONSOLE_READCONSOLE_CONTROL (dwCtrlWakeupMask)

Merci pour cette réponse. Si je boucle sur ReadConsole(), ce qui
m'oblige bien entendu à désactiver le mode ENABLE_LINE_INPUT, alors
d'une part cela m'oblige à réécrire toute la gestion de l'invite de
commandes et d'autre part je n'ai plus le support natif des séquences
"doskey" (historique, F7, ...).

La structure CONSOLE_READCONSOLE_CONTROL ne semble être disponible qu'à
partir de Vista et ses paramètres ne sont pas documentés (TBD). J'ai
fais plusieurs tests "en aveugle" en vain. Pourriez-vous compléter votre
réponse car là je sèche :-(

J'ai lu dans ce NG la chose suivante :
http://groups.google.fr/group/microsoft.public.windows.powershell/browse_frm/thread/267dab777f0b90fc/ed5ec81c31189295

<...>
... Powershell tab-completion works by using the alternate end-of-line
feature of the console subsystem just like cmd.exe.
<...>

Comment doit-on interpréter cet "alternate end-of-line feature" ? A mon
avis, je dois pouvoir conserver le mode ENABLE_LINE_INPUT tout en
activant, je ne sais comment, la sortie de la fonction ReadConsole() via
la touche TAB, non ?

Merci par avance.
Avatar
Christian ASTOR
gilles wrote:

Merci pour cette réponse. Si je boucle sur ReadConsole(), ce qui
m'oblige bien entendu à désactiver le mode ENABLE_LINE_INPUT, alors
d'une part cela m'oblige à réécrire toute la gestion de l'invite de
commandes et d'autre part je n'ai plus le support natif des séquences
"doskey" (historique, F7, ...).

La structure CONSOLE_READCONSOLE_CONTROL ne semble être disponible qu'à
partir de Vista et ses paramètres ne sont pas documentés (TBD). J'ai
fais plusieurs tests "en aveugle" en vain. Pourriez-vous compléter votre
réponse car là je sèche :-(



Non, on peut garder ENABLE_LINE_INPUT.

CONSOLE_READCONSOLE_CONTROL est valable sous XP, puisque CMD.EXE
l'utilise (ReadConsole() teste si le ImageSubsystemMajorVersion du PEB
est >=4, donc c'est théoriquement même valable sous NT)
Mais ça ne marche qu'en Unicode (ReadConsoleW() impérativement) =>

typedef struct _CONSOLE_READCONSOLE_CONTROL
{
IN ULONG nLength;
IN ULONG nInitialChars;
IN ULONG dwCtrlWakeupMask;
OUT ULONG dwControlKeyState;
} CONSOLE_READCONSOLE_CONTROL, *PCONSOLE_READCONSOLE_CONTROL;

Par exemple, pour TAB : dwCtrlWakeupMask = (1 << 0x09);
Il faut gérer ensuite soi-même l'action sur cette touche de sortie.
Avatar
gilles
"Christian ASTOR" a écrit dans le message
de news:45bc5f62$0$21151$
| gilles wrote:
|
|| Merci pour cette réponse. Si je boucle sur ReadConsole(), ce qui
|| m'oblige bien entendu à désactiver le mode ENABLE_LINE_INPUT, alors
|| d'une part cela m'oblige à réécrire toute la gestion de l'invite de
|| commandes et d'autre part je n'ai plus le support natif des séquences
|| "doskey" (historique, F7, ...).
||
|| La structure CONSOLE_READCONSOLE_CONTROL ne semble être disponible
|| qu'à partir de Vista et ses paramètres ne sont pas documentés (TBD).
|| J'ai fais plusieurs tests "en aveugle" en vain. Pourriez-vous
|| compléter votre réponse car là je sèche :-(
|
| Non, on peut garder ENABLE_LINE_INPUT.
|
| CONSOLE_READCONSOLE_CONTROL est valable sous XP, puisque CMD.EXE
| l'utilise (ReadConsole() teste si le ImageSubsystemMajorVersion du PEB
| est >=4, donc c'est théoriquement même valable sous NT)
| Mais ça ne marche qu'en Unicode (ReadConsoleW() impérativement) =>
[...]

J'avais testé votre solution dans tous les sens avec bien entendu la
fonction Ansi !
Tout est maintenant OK :-)

Un grand merci à vous !