让你的控制台程序也支持自动补齐

让你的控制台程序也支持自动补齐

关键字:控制台(Console), 自动补齐, 命令提示符(cmd.exe)

作者:xstring@csdn/peach@smth

时间:2004/3/23

 

Windows 2000, Windows XP, Windows Server 2003操作系统下的“命令提示符程序 cmd.exe)”了解稍多的人都会知道“命令提示符”有几个很好用的功能。一、支持命令历史记录,可以用上下键来切换以前输入的命令;二、支持快捷键功能(F1~F9)[具体每个键的功能请读者自己试吧];三、支持目录/文件名的自动补齐,这样可以快速输入目录/文件名。

 

这些功能对于用户来讲是非常友好的,可以让用户更方便的输入和编辑命令。我也相信任何一个写控制台程序的人都希望在自己的程序当中能够实现这样的功能。

 

那么如何让自己的程序有如上的功能呢?

 

对于上面提到前两个功能,操作系统本身已经提供了,你只需要简单的调用ReadConsole这个API就可以了。这个API会跟据你输入时的按键来执行这些功能。

对于第三个功能,MSDN中未曾提及,ReadConsole API的说明中任何一点都和此功能无关。实际上自动补齐功能要用到ReadConsole的一个公开的功能,而且只有Unicode版本的ReadConsoleW提供了该功能,ANSI版本的ReadConsoleA并不支持。

 

我们先看看ReadConsole这个API的原型(from MSDN

BOOL ReadConsole(

  HANDLE hConsoleInput,         // handle to console input buffer

  LPVOID lpBuffer,              // data buffer

  DWORD nNumberOfCharsToRead,   // number of characters to read

  LPDWORD lpNumberOfCharsRead,  // number of characters read

  LPVOID lpReserved             // reserved

);

 

MSDN中提到参数lpReserved这个参数必须为NULL值,当然MSDN中是这么提的,但对于ReadConsoleW来讲就不是了,因为自动补齐这个功能要靠ReadConsoleWlpReserved参数了。

 

该参数不为NULL时,可以指向一个如下的结构体

 

struct read_console_param

{

DWORD cbSize;

DWORD dwInitLen;

DWORD dwWakeMask;

DWORD dwUnknown;
};

 

其中每个成员变量的意义如下

²        cbSize - 该结构体的长度,16字节

²        dwInitLen – 指出lpBuffer中已有字符的数目,这样ReadConsole在等待用户输入时,也会把lpBuffer中已有的内容算进去。

²        dwWakeMask – 指出ReadConsole在接收到哪些Ctrl序列后返回,其中bit0对应^@, bit1对应^A, bit2对应^Bbit3对应^C,以此类推。当用户输入时,输入了dwWakeMask中指定的任何一个Ctrl按键,ReadConsole将返回。

²        dwUnknown具体什么意义暂不清楚,最初设为0即可

 

了解了ReadConsoleW的这个新功能后(其实该功能早就有了,只不过很多人不知道),那么就可以很容易地实现自动补齐了。

以下是我给的一个简单例子:

 

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <locale.h>

#include <windows.h>

 

#define    Ctrl(x)     ((x) & 0x37)

 

struct read_console_param

{

   DWORD nLength;

   DWORD dwInitLen;

   DWORD dwWakeMask;

   DWORD dwUnknown;

};

 

int main (void)

{

   HANDLE  hInput, hOutput;

   WCHAR   buf [0x100];

   read_console_param  param;

 

   setlocale (LC_ALL, ".ACP");

 

   memset (&param, 0, sizeof (param));

   param.nLength = sizeof (param);

 

   hInput       = GetStdHandle (STD_INPUT_HANDLE);

   hOutput    = GetStdHandle (STD_OUTPUT_HANDLE);

 

   buf [0] = 0;

   while (wcscmp (buf, L"quit") != 0)

   {

      DWORD read, written;

      printf ("/n$");

      param.dwInitLen      = 0;

      param.dwUnknown    = 0;

      //  我们使用^F^D来进行自动补齐

      param.dwWakeMask  = (1 << Ctrl ('F'))

         | (1 << Ctrl ('D'));

again:

      if (ReadConsoleW (hInput, buf, 0x100, &read, &param))

      {

         if (buf [read-1] == Ctrl ('F'))

         {    //     用户按下了^F, 自动补齐字符串"fff"

            //     然后继续等待输入

            wcscpy (buf+read-1, L"fff");

            WriteConsoleW (hOutput, L"fff", 3,

               &written, NULL);

            param.dwInitLen = read - 1 + 3;

            goto again;

         }

         else if (buf [read-1] == Ctrl ('D'))

         {    //     用户按下了^D, 自动补齐字符串"ddd"

            //     然后继续等待输入

            wcscpy (buf+read-1, L"ddd");

            WriteConsoleW (hOutput, L"ddd", 3,

               &written, NULL);

            param.dwInitLen = read-1+3;

            goto again;

         };

 

         //  去掉回车换行

         if (buf [read-1] == '/n')

            --read;

         if (buf [read-1] == '/r')

            --read;

         buf [read] = 0;

         printf ("you inputed: [%S]/n", buf);

      }

      else

      {

         printf ("ReadConsole failed with error %d/n",

            GetLastError ());

         break;

      };

   };

};

 

       这个例子是个最简单的例子,目前只支持在输入字符串的末尾进行自动补齐,无法在输入字符串的中间进行自动补齐;如果要写出cmd.exe那样的效果,还需要加很多的代码。

最后祝所有的程序员都能在Windows下写出支持自动补齐的控制台程序!

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
控制台程序是一种在计算机终端或命令行窗口中运行的程序,它通常不具有图形界面,而是通过文本输入和输出来进行交互。支持MFC(Microsoft Foundation Class)意味着该控制台程序可以使用MFC库提供的功能和特性。 MFC是Windows操作系统下的一个开发框架,它提供了一系列的类和函数,用于简化Windows应用程序的开发。通过对MFC库的支持控制台程序可以调用MFC提供的丰富功能,包括对话框、菜单、工具栏、文件操作、消息处理等等。 对于控制台程序来说,支持MFC可以带来以下几个优势: 1. 界面改善:通过MFC支持控制台程序可以使用MFC库提供的控件和界面组件,实现更友好的用户界面。例如,可以使用对话框来替代纯文本的输入输出,从而更直观地与用户进行交互。 2. 功能增强:MFC库中提供了丰富的功能模块,控制台程序可以利用这些功能模块来实现更复杂的功能需求。例如,可以利用MFC库提供的文件操作函数来进行文件的读写操作,从而实现文件处理功能。 3. 代码简化:MFC库提供了一系列封装好的类和函数,使得控制台程序的开发变得更加简单和高效。通过调用MFC提供的接口,开发者可以避免重复编写一些常用的代码,减少开发时间和代码量。 总之,控制台程序支持MFC可以使得程序的开发更加高效、界面更加友好、功能更加丰富。不过需要注意的是,在使用MFC的过程中,开发者需要对MFC库的使用进行熟悉和理解,以便充分发挥其优势。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值