我正在努力去GenerateConsoleCtrlEvent上班。这是我想出的最小示例:
#include <Windows.h>
static BOOL WINAPI handler(DWORD CtrlType)
{
return TRUE;
}
int main()
{
if (!SetConsoleCtrlHandler(&handler, TRUE))
{
throw 1;
}
STARTUPINFO si = {0};
DWORD dwStartupFlags = 0;
PROCESS_INFORMATION pi;
if (!CreateProcess(
NULL,
"cmd.exe",
NULL,
NULL,
FALSE,
dwStartupFlags,
NULL, // environ
NULL, // cwd
&si,
&pi))
{
throw 1;
}
CloseHandle(pi.hThread);
DWORD exitCode;
while(true)
{
switch (WaitForSingleObject(pi.hProcess, 1000 * 10))
{
case WAIT_TIMEOUT:
GenerateConsoleCtrlEvent(CTRL_C_EVENT, 0);
//WaitForSingleObject(pi.hProcess, INFINITE);
break;
case WAIT_OBJECT_0:
GetExitCodeProcess(pi.hProcess, &exitCode);
return exitCode;
}
} …Run Code Online (Sandbox Code Playgroud) 在 Windows 控制台应用程序中,可以ctrl+c使用以下命令捕获按下的按钮:
#include <stdio.h>\n#include <signal.h>\n\nvoid SigInt_Handler(int n_signal)\n{\n printf("interrupted\\n");\n}\n\nint main(int n_arg_num, const char **p_arg_list)\n{\n signal(SIGINT, &SigInt_Handler);\n getchar(); // wait for user intervention\n}\nRun Code Online (Sandbox Code Playgroud)\n\n\xc3\x97这很有效,但如果用户按下关闭控制台窗口的十字键,它根本不起作用。有这方面的信号吗?
我需要这个的原因是我有一个 CUDA 应用程序,如果在计算某些内容时关闭它,它往往会导致计算机崩溃。该代码是多平台的,因此我更喜欢使用信号而不是SetConsoleCtrlHandler. 有办法吗?
我尝试Yo在 Windows 10 计算机上运行生成器,但当我按箭头键选择选项时它没有反应。我在 GitHub 上发现了这个问题并尝试更改loopback:relation,但对我来说没有用。也许只有 Windows 10 上有新问题。
我还尝试返回到旧版控制台,但这都没有解决问题。
如何在 Windows 10 上让 Yo 识别箭头键?
我正在尝试 Windows 10 控制台中对 VT-100 转义序列的新(有限)支持。支持的序列记录在https://msdn.microsoft.com/en-us/library/windows/desktop/mt638032(v=vs.85).aspx。
我特别感兴趣的是以下报告当前光标位置的序列。
ESC[6n - responds with ESC[<n>;<m>R,
where <n> is the row number, and <m> the column number
Run Code Online (Sandbox Code Playgroud)
响应作为键盘输入传递,并显示在屏幕上,但我不知道如何以编程方式利用这些信息。理想情况下,我想从批处理文件中将<n>和值放入环境变量中。<m>
但是,如果任何人都可以演示如何使用任何语言捕获变量,那么我也许可以利用这些知识来开发有效的批处理文件策略。
我可以使用以下名为 ANSI.BAT 的简单脚本来接近
@echo off
setlocal enableDelayedExpansion
for /f "delims=" %%C in (
'forfiles /p "%~dp0." /m "%~nx0" /c "cmd /c echo(0x1B"'
) do set "esc=%%C"
set "csi=%esc%["
echo(Inquiry:%csi%6n
set /p "pos="
echo response=!pos:%esc%=ESC!
Run Code Online (Sandbox Code Playgroud)
- 输出 -
C:\test>ansi
Inquiry:
^[[3;9R
response=ESC[3;9R
C:\test>
Run Code Online (Sandbox Code Playgroud)
一旦我在变量中得到响应,我就可以使用 FOR /F 轻松解析出值。我遇到的问题是,<Enter>在屏幕上出现响应后,我必须手动按下该键才能终止 SET /P …
我对Windows编程的了解接近于零。但现在我已经制作了一个从 Windows 控制台运行的 Forth 程序,它打开一个原始的图形窗口。问题是我想通过按键来控制程序,但是当程序启动时,焦点没有在控制台窗口上,而是在图形窗口上。
如何改变后焦距?我想我必须使用一些 WINAPI,但是哪个呢?
ASCII 字符代码 0x07 是蜂鸣字符。
打开 CMD 并点击ALT+007产量:
当我点击ENTER- 我听到哔哔声。这可以。
我搜索了如何在批处理文件的末尾添加提示音,我发现这是解决方案:(我将其粘贴为图像,因为编辑后没有显示圆形项目符号):
这确实有效并且确实会发出声音。使用 HEX 查看器(使用Beyond compare)进行检查时ECHO,圆形项目符号为:
但是如果我手动将ALT+添加7到文档中,我会看到:
这是一个 95 作为十六进制 - 它不是蜂鸣声。此外,我转到了工作批处理文件,并用我的ALT+添加了一个新行7 :
但是通过十六进制查看器查看:
题:
我有点困惑。点击Alt+65确实产生A任何地方。
那么为什么在 Windows GUI 中保存时蜂鸣声不同并且不起作用?
在控制台中,如果我点击ALT+007我得到^G(它确实发出哔哔声),但是当我点击ALT+7我得到一个圆圈,这不是哔哔声:
这里有两个:
通过记事本++的另一个有趣的观察:
我认为这与编码等有关,但我不明白这种不一致之处。
在下面的程序中,我使用两个不同的函数打印到控制台
#include <windows.h>
int main() {
HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE);
DWORD byteswritten;
WriteConsole(h, "WriteConsole", 12, &byteswritten, NULL);
WriteFile(h, "WriteFile", 9, &byteswritten, NULL);
}
Run Code Online (Sandbox Code Playgroud)
如果当我执行这个程序并重定向它的输出使用a > out.txtora 1> out.txt什么都没有打印到控制台(如预期的那样)但内容out.txt只是
WriteFile
Run Code Online (Sandbox Code Playgroud)
允许将调用WriteFile重定向到文件和调用WriteConsole转到...无处的两者之间有什么不同
在 Windows 10 上用 gcc 和 msvc 测试
是否可以通过python更改Windows控制台的位置?如果没有,有什么解决方法吗?
我不知道您是否需要任何特定信息,但以防万一:我使用的是 Windows 8.1 (64x)、Python 3.5.0,正在生成控制台Popen,主要目标是将其移至顶部右上角。
如果需要任何信息,请告诉我。
我正在尝试通过 C# 中的 bash 运行 cygwin 命令,并尝试使用 read 命令保持结果打开。我的代码似乎是打开 bash 然后立即关闭。我究竟做错了什么?
static void Main(string[] args)
{
Process bashProcess = new Process();
bashProcess.StartInfo.FileName = @"C:\cygwin64\bin\bash.exe";
bashProcess.StartInfo.Arguments = "-l -c echo blah; read";
bashProcess.StartInfo.UseShellExecute = true;
bashProcess.Start();
bashProcess.WaitForExit();
System.Console.WriteLine("Exit Code: {0}", bashProcess.ExitCode);
System.Console.WriteLine("Press enter to exit...");
System.Console.ReadLine();
}
Run Code Online (Sandbox Code Playgroud) 我正在使用带有 mingw-w64(gcc 版本 8.1.0,x86_64-posix-sjlj-rev0,由 MinGW-W64 项目构建)的 Microsoft Windows 10 和cmd. 当我尝试在 Windows 控制台上打印或存储然后打印西班牙语字符时,它显示错误。例如我试图执行这个程序:
#include <stdio.h>
int main(void) {
char c[20];
printf("pía\n");
scanf("%s", c);
printf("%s", c);
}
Run Code Online (Sandbox Code Playgroud)
如果我引入一些西班牙语字符,返回的句子是可以的,但开头的打印句显示错误:
p?¡a
laíóñaú
laíóñaú
Run Code Online (Sandbox Code Playgroud)
一些解决方案建议放置setlocale()函数,但结果是相同的。其他解决方案是将 UTF-8 unicode 兼容性放在区域设置上:
但是现在错误相反,打印出来的没问题,但是当我引入一个奇怪的字符时,控制台没有显示它:
pía
lía
l
Run Code Online (Sandbox Code Playgroud)
有点令人沮丧,因为我看到的所有解决方案都是通过上述或设置解决的setlocale(),但没有一个对我有用,我不知道为什么。
正如Mofi在评论中所说,我尝试使用SetConsoleCP()并SetConsoleOutputCP()更改控制台的代码页。在没有完全理解这些函数是如何工作的情况下,使用与上面相同的代码,我运行了几个错误结果的示例:
pía | p?¡a | p?¡a | pía
lía | lía | lía | lía
l | l | lía | la
input: 65001 output 65001 | input: …Run Code Online (Sandbox Code Playgroud) windows-console ×10
windows ×4
c ×3
cmd ×3
winapi ×3
batch-file ×2
c# ×2
ansi-escape ×1
console ×1
cygwin ×1
forth ×1
python ×1
setfocus ×1
signals ×1
windows-10 ×1
yo ×1