- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在尝试使用 Win API ReadConsole(...)
,我想传入一个分隔符字符以停止来自控制台的输入。下面的代码有效,但它只会停止读取 \r\n
上的输入。例如,我希望它停止读取 '.'
上的控制台输入。
void read(char *cIn, char delim)
{
HANDLE hFile;
DWORD charsRead;
DWORD charsToRead = MAX_PATH;
CONSOLE_READCONSOLE_CONTROL cReadControl;
cReadControl.nLength = sizeof(CONSOLE_READCONSOLE_CONTROL);
cReadControl.nInitialChars = 0;
cReadControl.dwCtrlWakeupMask = delim;
cReadControl.dwControlKeyState = NULL;
DWORD lpMode;
// char cIn[MAX_PATH]; //-- buffer to hold data from the console
hFile = CreateFile("CONIN$", GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_WRITE | FILE_SHARE_READ, NULL,
OPEN_EXISTING, 0, NULL);
GetConsoleMode(hFile,&lpMode);
// lpMode &= ~ENABLE_LINE_INPUT; //-- turns off this flag
// SetConsoleMode(hFile, lpMode); //-- set the mode with the new flag off
bool read = ReadConsole(hFile, cIn, charsToRead * sizeof(TCHAR), &charsRead, &cReadControl);
cIn[charsRead - 2] = '\0';
}
我知道还有其他简单的方法可以做到这一点,但我只是想了解一些 win api 函数以及如何使用它们。
谢谢。
最佳答案
我看到这个问题并认为它是微不足道的,但花了最后 30 分钟试图弄明白并最终得到了一些东西。
那个dwCtrlWakeupMask
CONSOLE_READCONSOLE_CONTROL
中的记录很差. MSDN 说“A user-defined control character used to signal that the read is complete.”,但为什么叫它 mask
?为什么是ULONG
而不是 TCHAR
或类似的东西?我试着给它喂 chars 和 wchars 但什么也没发生,所以一定有更多的故事。
我上网搜索那个特定变量并找到了这个链接: https://groups.google.com/forum/#!topic/golang-codereviews/KSp37ITmcUg这是一个随机的 Go 库编码器寻求帮助,答案是选项卡是 1 << '\t'
.我试过了,很有效!
因此,对于 future 的网络搜索者,dwCtrlWakeupMask
是将导致 ReadConsole
的 ASCII 控制字符的位掩码返回。你可以|
一起尽可能多1 << ctrl_char
随心所欲...但它不能是任意字符,因为它是 32 位值的位掩码,只有字符 1-31(含)是可能的(顺便说一下,这个组称为控制字符,它包括制表符之类的东西, backspace, bell; 本身不代表可打印字符的东西)。
因此,这个面具:
cReadControl.dwCtrlWakeupMask = (1 << '\t') | (1 << 0x08);
会导致ReadConsole
在按下制表符 (\t
) 或退格键 (0x08
) 时返回。
ctrl+ some_ascii_value
代表的字符是英文字母表中该字母的编号,从 a == 1 开始。因此,ctrl+d
是4
, 和 ctrl+z
是26
.
因此,这将在用户点击 ctrl+d
时返回或 ctrl+z
:
cReadControl.dwCtrlWakeupMask = (1 << 4) | (1 << 26);
请注意,Linux 终端驱动程序也会在 read
上返回当用户点击 ctrl+d
所以这可能是一个很好的兼容性。
我相信这个论点的重点是允许在处理输入模式下更容易完成制表符;否则,您必须关闭已处理的输入并一个一个地处理 key 才能做到这一点。现在你不必......虽然说实话,我仍然更喜欢用 ReadConsoleInput
来接受我的意见。用于交互式程序,因为您可以更好地控制它。
但是虽然有很多其他方法可以做你想做的事 - 并使用 .
因为分隔符在这里是不可能的,因为它的值> = 32,所以你需要自己做......无论如何了解它的作用对我来说很有趣,而且网络上资源稀缺所以我正在写这个仅供将来引用。
请注意,这在 wineconsole
中似乎不起作用所以请确保您在真正的 Windows 机器上进行测试。
现在,dwControlKeyState
实际上是由函数设置的。您传入的值将被忽略(至少据我所知),但是您可以在函数返回时检查它是否有给定的标志。因此,例如,在调用 ReadConsole
之后并按下键,如果你的 numlock 是打开的,它将是 32。如果 numlock 已打开并且您按下 shift+tab(并已打开 numlock),则为 48。所以你在函数返回后测试它。
我通常喜欢 MSDN 文档,但 IMO 他们在解释这个参数时完全失误了!
关于c++ - 赢 api readConsole(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43836040/
使用掷骰子游戏中的 10,000 次模拟来计算获胜概率 (wins/(wins + Loss))。下面是双骰子游戏的方法: public class CrapsGame { public st
我想制作一个程序作为检查网,如果地址向上,则返回 1;如果地址向下,则返回 0。代码如下: #include #include #include #pragma comment(lib, "ws
我正在尝试使用 Win API ReadConsole(...),我想传入一个分隔符字符以停止来自控制台的输入。下面的代码有效,但它只会停止读取 \r\n 上的输入。例如,我希望它停止读取 '.' 上
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwar
我想在 d3.js 中制作一个条形图,每个项目或行都有正条和负条,如下所示: 它有点像谷歌金融“行业摘要”图表(http://google.com/finance) 任何人都可以指出我这种图表的 d3
尝试根据 GF 和 GA 创建一个新列“Results”。想知道如何通过定义函数和条件语句来做到这一点。以下是我对一行的初步尝试,但无法弄清楚如何将其应用于所有行,非常感谢您的帮助! 日期地点对手GF
过去,我通过 wpf 使用 mvvmlight 并取得了一定程度的成功。我最近看到了 Caliburn Micro,但我想知道是否有人对此有任何经验。 我看到了 Caliburn Micro 的网站,
我正在尝试将 FFMPEG(我实际上只是在寻找 FFProbe,它包含在 FFMPEG 工具中)编译为适用于 MacOS X、Linux 和可能的 Windows 的独立应用程序。对于独立,我的意思是
你能告诉我你是如何让 PartCover 在 VS2008 上运行并赢得 7 x64 的吗?基于此帖子 How do I run PartCover in x64 windows ,我跑了 c:\Pr
我要抓: 窗口调整大小/移动/最小化/最大化/关闭消息。 鼠标点击和键盘按下。 当用户按 enter 或 dblclick 执行任何程序时。 (如果可能的话?) 这应该与键锁程序的工作方式相同:如果您
我正在创建一个实用软件,其中存储了 PC 的所有详细信息,我设法找到了一个包含我想要的所有详细信息的程序“msinfo32”。 目前的问题是我不知道如何尽快在软件中获取这些信息。 请帮我写一段代码 提
我需要我的一个 .exe 文件在没有 UAC 提示的情况下始终以管理员身份运行。我的程序将与安装程序一起安装,它将有一次管理员权限,我需要在这个安装程序中执行这样的步骤,我的 exe 将始终以管理员身
这个错误发生在前一段时间,2011年 http://cygwin.com/ml/cygwin/2013-11/msg00021.html 根据我在这篇文章和其他一些文章中所读到的内容,我看到他们写了一
关于 tel 协议(protocol)处理程序:除了在窗口 10 下,我的应用程序工作正常。在窗口 10 下需要哪些额外的注册表项才能为 tel 协议(protocol)注册应用程序(因此我的应用程序
我是一名优秀的程序员,十分优秀!