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é ?
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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)
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)
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)
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.
"Christian ASTOR" <castorix@club-internet.fr> a écrit dans le message
de news:45bb5c18$0$21144$7a628cd7@news.club-internet.fr
| 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 ?
"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.
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.
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.
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.
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 !
"Christian ASTOR" <castorix@club-internet.fr> a écrit dans le message
de news:45bc5f62$0$21151$7a628cd7@news.club-internet.fr
| 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 :-)
"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 :-)