标签: windows-console

如何让GenerateConsoleCtrlEvent与cmd.exe一起使用

我正在努力去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 winapi cmd console-application windows-console

5
推荐指数
0
解决办法
2799
查看次数

Windows 控制台应用程序 - 关闭事件的信号

在 Windows 控制台应用程序中,可以ctrl+c使用以下命令捕获按下的按钮:

\n\n\n\n
#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}\n
Run Code Online (Sandbox Code Playgroud)\n\n

\xc3\x97这很有效,但如果用户按下关闭控制台窗口的十字键,它根本不起作用。有这方面的信号吗?

\n\n

我需要这个的原因是我有一个 CUDA 应用程序,如果在计算某些内容时关闭它,它往往会导致计算机崩溃。该代码是多平台的,因此我更喜欢使用信号而不是SetConsoleCtrlHandler. 有办法吗?

\n

c signals console-application windows-console

5
推荐指数
1
解决办法
4297
查看次数

如何在 Windows 10 上让 Yo 识别箭头键?

我尝试Yo在 Windows 10 计算机上运行生成器,但当我按箭头键选择选项时它没有反应。我在 GitHub 上发现了这个问题并尝试更改loopback:relation,但对我来说没有用。也许只有 Windows 10 上有新问题。

我还尝试返回到旧版控制台,但这都没有解决问题。

如何在 Windows 10 上让 Yo 识别箭头键?

windows-console windows-10 yo

5
推荐指数
1
解决办法
753
查看次数

通过 Windows 10 控制台 VT-100 转义序列获取光标位置

我正在尝试 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 …

batch-file ansi-escape windows-console

5
推荐指数
1
解决办法
1850
查看次数

将焦点更改回控制台窗口

我对Windows编程的了解接近于零。但现在我已经制作了一个从 Windows 控制台运行的 Forth 程序,它打开一个原始的图形窗口。问题是我想通过按键来控制程序,但是当程序启动时,焦点没有在控制台窗口上,而是在图形窗口上。

如何改变后焦距?我想我必须使用一些 WINAPI,但是哪个呢?

c# forth setfocus windows-console

5
推荐指数
0
解决办法
1659
查看次数

控制台哔声字符代码 - 错误号码?

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我得到一个圆圈,这不是哔哔声:

这里有两个:

在此处输入图片说明

通过记事本++的另一个有趣的观察:

在此处输入图片说明

我认为这与编码等有关,但我不明白这种不一致之处。

windows cmd batch-file windows-console

5
推荐指数
1
解决办法
1382
查看次数

为什么我不能重定向 WriteConsole 的输出?

在下面的程序中,我使用两个不同的函数打印到控制台

#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 测试

c console winapi windows-console

5
推荐指数
1
解决办法
2299
查看次数

使用 Python (Windows) 更改控制台窗口的位置

是否可以通过python更改Windows控制台的位置?如果没有,有什么解决方法吗?

我不知道您是否需要任何特定信息,但以防万一:我使用的是 Windows 8.1 (64x)、Python 3.5.0,正在生成控制台Popen,主要目标是将其移至顶部右上角。

如果需要任何信息,请告诉我。

python windows windows-console

5
推荐指数
1
解决办法
3649
查看次数

如何从 C# 执行 cygwin 命令并使其保持打开状态?

我正在尝试通过 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)

c# cygwin windows-console

5
推荐指数
1
解决办法
1861
查看次数

在 cmd 中打印和存储西班牙语字符(á、é、í、ñ...)

我正在使用带有 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)

c windows winapi cmd windows-console

5
推荐指数
1
解决办法
249
查看次数