-
2022-02-16 14:18:25
电脑快捷键进入命令提示符界面(window键+R后输入CMD)
常见的文件操作
1.切换盘符
比如切换到D盘,直接输入
d:
2.查看当前目录下文档
dir
进入某个文件夹
cd xx/
创建文件夹 test
md test 或者 mkdir test
创建文件
type nul>文件名.文件类型
删除空文件夹test
rd test
删除非空文件夹test以及子目录
rd /s test 或者强制删除不带提示(谨慎使用) rd /s/q test
删除test.txt文件
del test.txt
查看文件内容(.txt .bat)
type test.txt
删除多个文件,不在同一目录下,注意补全路径
复制(copy)
将a.txt粘贴到d:\soft目录下,重命名为b.txt
copy a.txt d:\soft\b.txt
移动(move)
将a.txt移动到d:\soft目录下,重命名为b.txt
move a.txt d:\soft\b.txt 不重命名可以是 move a.txt d:\test\
常见的查看网络情况
查看ip地址
ipconfig
查看网络链接情况
netstat -ano
查看特定的端口占用情况
netstat -ano | find 指定端口 在这里有一个显示PID情况 listening 表示正在监听 established 表示建立连接,正在通信(重点关注) close_wait 表示对方主动关闭连接 time_wait 表示我方断开连接,等待状态
启动本地服务
Pyhton -m http.server 端口号
查看用户
net user net user username(查看某个用户具体的信息)
查看系统信息,版本,补丁信息
systeminfo
更多相关内容 -
Windows控制台是什么,如何打开Win7控制台?
2021-07-09 04:32:44Windows控制台是什么,如何打开Win7控制台?今天看到有朋友提问Windows控制台是什么,这个程序都快被绝大多数朋友遗忘了,这位朋友真是有心!但是小编对这个问题也不甚了了,所以下面我们一起来学习下相关的内容,希望...Windows控制台是什么,如何打开Win7控制台?今天看到有朋友提问Windows控制台是什么,这个程序都快被绝大多数朋友遗忘了,这位朋友真是有心!但是小编对这个问题也不甚了了,所以下面我们一起来学习下相关的内容,希望通过小编的介绍,您有一个大致的了解,在今后的内容中,我们将进一步学习关于Windows控制台的使用方法,,如果您对这个问题也感兴趣的话,不妨关注下小站接下来的更新。
一、Windows控制台是什么
Windows控制台全称为Microsoft管理控制台,他的另一个名称为MMC是英语Microsoft Management Console的首字母缩写,程序文件默认位于C:\Windows\System32目录下,名称为mmc.exe,是所有管理工具的底层统一平台,通过它用户可以创建、保存或打开管理工具来管理硬件、软件和Windows系统的网络组件。
二、如何打开Win7控制台
我们可以通过双击如果嫌去系统文件夹麻烦,我们可以通过运行命令调出Windows控制台,Win7系统下(支持微软所有操作系统版本),按下Win+R组合键,输入“mmc(没有外边的双引号)”后回车,就可以打开Windows控制台了。
Windows控制台是什么,如何打开Win7控制台实在是太简单,希望接下来的内容,能够让您满意!
-
终端:新的Windows终端和原始的Windows控制台主机都在同一位置!
2021-02-06 01:18:09Windows控制台主机( conhost.exe ) 两个项目之间共享的组件 显示如何使用Windows控制台API的 相关存储库包括: () 安装并运行Windows Terminal :red_circle: 注意:Windows Terminal需要Windows 10 1903... -
新的Windows Terminal和原始的Windows控制台主机都在同一位置!-C/C++开发
2021-05-26 19:13:18欢迎使用Windows终端,控制台和命令行存储库此存储库包含以下源代码:Windows终端Windows控制台主机(conhost.exe)两个项目之间共享的组件ColorTool欢迎使用Windows终端,控制台和命令行存储库该存储库包含以下源... -
使用windows控制台调试服务的方法
2020-09-04 15:02:11主要介绍了使用windows控制台调试服务的方法,需要的朋友可以参考下 -
操作系统实验——Windows 控制台命令.docx
2020-10-30 10:39:57(1)实现命令行窗口的显示设置。 (2)实现系统的基本配置。 (3)显示系统基本信息。 (4)实现系统配置管理。 (5)任务管理。 -
windows控制台wsprintf打印utf8字符串例子
2020-06-12 08:52:33windows控制台 wsprintf 打印 utf8 字符串例子,用VS2015编译。 通过一个 hpp 头文件定义了utf8转utf16的功能函数,将 utf8 字符串转为utf16后传递给 wsprintf 打印 出来。 -
Windows 控制台仿真器 Cmder v1.3.14
2020-05-27 10:31:28Cmder是Windows下非常好用的终端模拟器, 常用于替换windows自带的终端。它可以在不同的标签页中同时连接不同的底层Shell,包括cmd、PowerShell、Bash和WSL,并提供相关增强功能和更加便捷的操作方式。Cmder工具包... -
DELPHI Windows 控制台信息
2020-07-14 10:49:39WINDOWS程序中通过管道操作,获取控制台程序的输入输出信息,可判断程序的运行,完成序列化任务程序的自动调用与执行。源码为D2010编写,利用了Windows API函数实现,其他语言也可以参考。 -
修改windows控制台程序图标
2016-04-07 21:41:10修改windows控制台程序图标 -
控制台程序Windows服务.rar
2020-05-11 14:25:18.net控制台程序+Windows服务 通过控制台程序,创建成windows服务 /* 1. 程序写完后,生成 2. 点击debug文件中的install.bat安装服务 3. 去系统服务中 找到服务启动它 */ -
ConsoleX:控制台X,备用Windows控制台。-开源
2021-05-07 23:29:29控制台X,备用Windows控制台。 -
cpp-Windows控制台监控器
2019-08-16 05:44:36Windows控制台监控器。Windows Console Monitoring。 -
Windows控制台常用指令
2020-12-14 16:38:531.如何改变命令提示符当前路径 刚打开CMD时,路径通常是当前用户名下的路径: 直接使用cd d:是无法切换到其他驱动路径下的。需要使用驱动盘符加冒号d: 另一种方式是使用cd /d 盘符 移至上层目录:cd .. ...1.如何改变命令提示符当前路径
刚打开CMD时,路径通常是当前用户名下的路径:
直接使用cd d:
是无法切换到其他驱动路径下的。需要使用驱动盘符加冒号d:
另一种方式是使用cd /d 盘符
移至上层目录:cd ..
2.浏览当前目录下所有文件
使用dir
命令
3.创建文件夹
使用mkdir
命令+文件夹名
4.重命名文件或文件夹
使用ren
命令,ren old_name new_name
5.复制文件
使用命令copy source_file new_file
在复制过程中可以重命名。
6.拷贝整个文件夹
使用xcopy /s /i source_folder new_folder
“/s” 含义为将拷贝的当前目录和其子目录全部拷贝,“/i"含义为如果新目录不存在,则创建,并将文件放入其中。
7.创建文件
使用命令type nul > 文件名
第二种方式是echo string > file_name
8.查看文件
使用more file_name
或type file_name
9.删除文件
使用del file_name
10.删除文件夹
使用rmdir /Q /S folder_name
如果文件夹名字中有空格,则使用引号将名字包起来。
还有一种方式是先进去文件夹中删除所有文件,再返回上层删除目录:
命令del /F /Q /S *.* > NUL
-
windows 控制台贪吃蛇-snake.zip
2021-08-27 11:13:39windows 控制台贪吃蛇-半成品-mingw-cmake构建 -
【C++】Windows控制台API基本使用(上)
2021-11-13 16:19:02ANSI 转义序列三、新版控制台特性五、通过代码打开 ANSI 转义序列六、控制台编码一、设置输出编码二、设置输入编码七、修改控制台文本样式一、使用API二、使用ANSI转义序列八、控制台窗口标题一、获取控制台窗口标题...目录
前言
本文章所使用的一些API为
旧版API
,建议使用其它方案代替它们。
本文章多有些纰漏,若发现错误请在评论区指正。
注: 文章内所有代码均在VS2019下编译通过。一、控制台缓冲区大小
一、获取缓冲区大小
GetConsoleScreenBufferInfo 可以获取到控制台窗口的一些信息。
BOOL WINAPI GetConsoleScreenBufferInfo( _In_ HANDLE hConsoleOutput, // 输出句柄 _Out_ PCONSOLE_SCREEN_BUFFER_INFO lpConsoleScreenBufferInfo // 缓冲区信息结构体 );
PCONSOLE_SCREEN_BUFFER_INFO 实际上是一个指针,可以使用_CONSOLE_SCREEN_BUFFER_INFO 或 CONSOLE_SCREEN_BUFFER_INFO 替代它。此结构体的原型为:
typedef struct _CONSOLE_SCREEN_BUFFER_INFO { COORD dwSize; // 缓冲区大小 COORD dwCursorPosition; // 控制台屏幕缓冲区中光标的列和行坐标 WORD wAttributes; SMALL_RECT srWindow; // 显示窗口左上角和右下角的控制台屏幕缓冲区的坐标(即窗口大小) COORD dwMaximumWindowSize; // 在给定当前屏幕缓冲区大小和字体和屏幕大小的情况下,它包含控制台窗口的最大大小(字符列和行) } CONSOLE_SCREEN_BUFFER_INFO;
此结构体同样包含缓冲区光标位置的信息,在获取光标位置时可以使用此结构体。
下方代码将会输出缓冲区大小。#include <stdio.h> #include <Windows.h> int main(int argc, char* argv[]) { // 获取输出句柄 HANDLE outputHandle = GetStdHandle(STD_OUTPUT_HANDLE); CONSOLE_SCREEN_BUFFER_INFO info; GetConsoleScreenBufferInfo(outputHandle, &info); printf("缓冲区大小: x=%hd, y=%hd\n", info.dwSize.X, info.dwSize.Y); return 0; }
二、设置缓冲区大小
(旧版API)SetConsoleScreenBufferSize 可以修改控制台的缓冲区大小。
WINBASEAPI BOOL WINAPI SetConsoleScreenBufferSize( _In_ HANDLE hConsoleOutput, // 输出句柄 _In_ COORD dwSize // 新缓冲区大小 );
此函数接受一个 COORD 结构体 作为参数,其原型为:
typedef struct _COORD { SHORT X; SHORT Y; } COORD, *PCOORD;
下方代码将会设置缓冲区大小为115×40个字符。
#include <stdio.h> #include <Windows.h> int main(int argc, char* argv[]) { // 获取输出句柄 HANDLE outputHandle = GetStdHandle(STD_OUTPUT_HANDLE); // 定义大小 COORD size = { 115, 40 }; // 应用 SetConsoleScreenBufferSize(outputHandle, size); SetConsoleScreenBufferSize(outputHandle, size); return 0; }
不建议使用此API。三、更详细的结构体
CONSOLE_SCREEN_BUFFER_INFOEX 结构体能够记录更多的控制台信息,并且也有与之匹配的获取(GetConsoleScreenBufferInfoEx)和设置(SetConsoleScreenBufferInfoEx)函数。多数情况下,笔者更推荐使用 CONSOLE_SCREEN_BUFFER_INFOEX,因为 CONSOLE_SCREEN_BUFFER_INFOEX 拥有与之匹配的函数,而 _CONSOLE_SCREEN_BUFFER_INFO 和 CONSOLE_SCREEN_BUFFER_INFO 仅有一个获取函数(GetConsoleScreenBufferInfo),所以,能用就用吧。
下面的代码演示了如何使用 CONSOLE_SCREEN_BUFFER_INFOEX。#include <stdio.h> #include <Windows.h> int main(int argc, char* argv[]) { // 获取输出句柄 HANDLE outputHandle = GetStdHandle(STD_OUTPUT_HANDLE); CONSOLE_SCREEN_BUFFER_INFOEX info; info.cbSize = sizeof(info); // 不要忘记指定结构体大小 GetConsoleScreenBufferInfoEx(outputHandle, &info); printf( "缓冲区大小: x=%hd, y=%hd\n" "窗口大小: x=%hd, y=%hd\n" "光标坐标: x=%hd, y=%hd\n" , info.dwSize.X, info.dwSize.Y, info.srWindow.Right + 1, info.srWindow.Bottom + 1, info.dwCursorPosition.X, info.dwCursorPosition.Y); return 0; }
四、特性
新版控制台又出特性了。在使用 GetConsoleScreenBufferInfoEx 获取控制台缓冲区信息后,如果再次设置,控制台的大小竟会缩减1行!?笔者在 stackoverflow 查找到了解决方法——只需在获取信息后将 srWindow 的 Right 和 Bottom 加 1。请参阅下方代码。
#include <stdio.h> #include <Windows.h> int main() { // 输出句柄 HANDLE outputHandle = GetStdHandle(STD_OUTPUT_HANDLE); // 控制台缓冲区信息 CONSOLE_SCREEN_BUFFER_INFOEX csbi; csbi.cbSize = sizeof(csbi); // 获取信息 GetConsoleScreenBufferInfoEx(outputHandle, &csbi); printf("获取到的 srWindow 的值:{%d %d %d %d}\n", csbi.srWindow.Left, csbi.srWindow.Top, csbi.srWindow.Right, csbi.srWindow.Bottom); csbi.srWindow.Right++; csbi.srWindow.Bottom++; printf("更正后的 srWindow 的值:{%d %d %d %d}\n", csbi.srWindow.Left, csbi.srWindow.Top, csbi.srWindow.Right, csbi.srWindow.Bottom); return 0; }
效果:
二、窗口大小
一、获取窗口大小
对于这种需求,CONSOLE_SCREEN_BUFFER_INFOEX 可以解决一切问题。但现在这里将依然使用 GetConsoleScreenBufferInfo 函数获取窗口大小。下面代码将会演示此功能。
#include <stdio.h> #include <Windows.h> int main(int argc, char* argv[]) { // 获取输出句柄 HANDLE outputHandle = GetStdHandle(STD_OUTPUT_HANDLE); CONSOLE_SCREEN_BUFFER_INFO info; GetConsoleScreenBufferInfo(outputHandle, &info); printf("窗口大小: x=%hd, y=%hd\n", info.srWindow.Right + 1, info.srWindow.Bottom + 1); return 0; }
注: srWindow会把0也算进窗口大小内,所以需要将结果加1得到正确的数字。
使用 CONSOLE_SCREEN_BUFFER_INFOEX 的样例在第一节的第三小节。二、设置窗口大小
(旧版API)SetConsoleWindowInfo 可以做到这一点。
查阅 Microsoft Docs 了解此函数的参数。
下面的代码可以实现此功能。#include <stdio.h> #include <Windows.h> int main(int argc, char* argv[]) { // 获取输出句柄 HANDLE outputHandle = GetStdHandle(STD_OUTPUT_HANDLE); SMALL_RECT winSize = {0, 0}; winSize.Right = 20 - 1; winSize.Bottom = 10 - 1; SetConsoleWindowInfo(outputHandle, 1, &winSize); SetConsoleWindowInfo(outputHandle, 1, &winSize); printf("窗口大小被改变。\n"); return 0; }
三、光标位置
一、获取光标位置
第一节的第三小节的示例代码演示了如何获取光标位置。而 _CONSOLE_SCREEN_BUFFER_INFO 和 CONSOLE_SCREEN_BUFFER_INFO 也可以获取光标位置。
_CONSOLE_SCREEN_BUFFER_INFO 和 CONSOLE_SCREEN_BUFFER_INFO 的 dwCursorPosition 成员规定了光标的坐标。 CONSOLE_SCREEN_BUFFER_INFOEX 也有该成员。下面代码演示了如何使用 _CONSOLE_SCREEN_BUFFER_INFO 和 CONSOLE_SCREEN_BUFFER_INFO 的 dwCursorPosition 成员获取光标信息。#include <stdio.h> #include <Windows.h> int main(int argc, char* argv[]) { // 获取输出句柄 HANDLE outputHandle = GetStdHandle(STD_OUTPUT_HANDLE); CONSOLE_SCREEN_BUFFER_INFO info; GetConsoleScreenBufferInfo(outputHandle, &info); printf("光标位置: (%hd,%hd)\n", info.dwCursorPosition.X, info.dwCursorPosition.Y); return 0; }
二、设置光标位置
Windows 10 支持特殊 ANSI 序列,可以直接输出 ANSI 转义序列移动光标。
#include <stdio.h> int main(int argc, char* argv[]) { // 光标即将前往的坐标 short x = 5, y = 5; printf("\x1b[%hd;%hdH", y + 1, x); printf("Hello world!\n"); return 0; }
使用 (旧版API)SetConsoleCursorPosition 函数可以在新旧版控制台中工作。如果程序需要跨平台,最好不使用此 API。
四、设置光标是否显示
一、旧版API
(旧版API)GetConsoleCursorInfo、(旧版API)SetConsoleCursorInfo 和 (旧版结构)CONSOLE_CURSOR_INFO 搭配可以设置光标信息。下方代码演示了这项工作。
#include <stdio.h> #include <Windows.h> int main(int argc, char* argv[]) { // 获取句柄 HANDLE outputHandle = GetStdHandle(STD_OUTPUT_HANDLE); // 获取光标信息 _CONSOLE_CURSOR_INFO cursorInfomations; GetConsoleCursorInfo(outputHandle, &cursorInfomations); // 将光标设为不可见 cursorInfomations.bVisible = 0; // 应用光标信息 SetConsoleCursorInfo(outputHandle, cursorInfomations); printf("光标被 API 隐藏了。\n"); return 0; }
此 API 建议在旧版控制台使用,最好不在新版控制台用。二、新版控制台的 ANSI 转义序列
下方代码将通过 ANSI 转义序列显示或隐藏光标。
#include <stdio.h> #include <Windows.h> void setCursorVisible(bool status) { // \033[?25h 显示光标 // \033[?25l 隐藏光标 printf("\033[?25%c", (status ? 'h' : 'l')); } int main(int argc, char* argv[]) { setCursorVisible(1); // 显示 setCursorVisible(0); // 隐藏 return 0; }
三、新版控制台特性
在 Win10 新版控制台中最好不要隐藏光标,因为不管使用 API 隐藏还是 ANSI 转义序列隐藏,用鼠标拖拽窗口改变大小都会导致光标重新显示。下方GIF演示了新版控制台的特性。
五、通过代码打开 ANSI 转义序列
Windows 10 新版控制台可以手动开启 ANSI 转义序列,下方代码将会演示此功能,重点在于
enabledANSI
函数。#include <stdio.h> #include <Windows.h> // 启用 ANSI bool enabledANSI(HANDLE outputHandle) { if (outputHandle == INVALID_HANDLE_VALUE) { return 0; } DWORD dwMode_Out = 0; // 获取当前控制台模式 if (!GetConsoleMode(outputHandle, &dwMode_Out)) { return 0; } // 启用设置 dwMode_Out |= ENABLE_PROCESSED_OUTPUT; dwMode_Out |= ENABLE_VIRTUAL_TERMINAL_PROCESSING; dwMode_Out |= DISABLE_NEWLINE_AUTO_RETURN; // 设置 if (!SetConsoleMode(outputHandle, dwMode_Out)) { return 0; } return 1; } int main(int argc, char* argv[]) { bool status = enabledANSI(GetStdHandle(STD_OUTPUT_HANDLE)); printf("ANSI 转义序列打开....。\b\b\b\b\b\b"); if (status) { printf("成功"); } else { printf("失败"); } printf("\n"); return 0; }
此程序在笔者的系统上成功运行。
六、控制台编码
一、设置输出编码
SetConsoleOutputCP 函数可以修改当前控制台输出的代码页,其接受一个 UINT(unsigned int) 作为参数。
BOOL WINAPI SetConsoleOutputCP( _In_ UINT wCodePageID // 新代码页 );
下面的代码将会演示此函数的功能。
#include <stdio.h> #include <Windows.h> int main(int argc, char* argv[]) { SetConsoleOutputCP(437); printf("English.\n"); printf("中文。\n"); printf("日本語。\n"); return 0; }
代码页437是美国英语的代码页,其只能显示英语字符(准确来说是 ASCII 码内的字符),所以在输出其它语种时就会出现乱码,如上图所示。
下表是部分代码页。代码页 描述 437 美国英语 850 多语言 857 土耳其语 866 俄语 869 现代希腊语 936 简体中文 定义常量以区分这些代码页。
//C #define US 437 #define MULTILINGUAL 850 #define TURKISH 857 #define RUSSIA 866 #define MODERNGREEK 869 #define CHINESE 936 //C++ unsigned short const US = 437, MULTILINGUAL = 850, TURKISH = 857, RUSSIA = 866, MODERNGREEK = 869, CHINESE = 936;
GetConsoleOutputCP 可以获取当前活动代码页。下方代码将会演示此功能。
#include <stdio.h> #include <Windows.h> int main(int argc, char* argv[]) { printf("Code: %hd\n", GetConsoleOutputCP()); return 0; }
二、设置输入编码
SetConsoleCP 函数可以设置输入编码。Microsoft Docs 这么描述它:
“设置与调用进程关联的控制台使用的输入代码页。 控制台使用其输入代码页将键盘输入转换为相应的字符值。”
Microsoft Docs 明确说明了此 API 用于设置输入的字符的代码页。下方代码将会演示此功能。
// VS2019下需要定义此宏 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <Windows.h> int main(int argc, char* argv[]) { // 修改输入代码页 SetConsoleCP(437); printf("输入一串字符串: "); char getString[20] = ""; scanf("%[^\n]", getString); printf("输入的内容是:\n%s\n", getString); return 0; }
虽然控制台在接受字符串时显示了中文,但是在输出该字符串时却出现了乱码,而控制台还是可以输出中文,这就是 SetConsoleCP 的作用,更改输入内容的代码页。
与 GetConsoleOutputCP 一样,GetConsoleCP 也能获取活动的代码页,但是获取的是活动的输入代码页的代码。七、修改控制台文本样式
一、使用API
SetConsoleTextAttribute 函数可以更改接下来输出的文字的样式,通过下方代码您就可以了解其作用。
#include <stdio.h> #include <Windows.h> int main(int argc, char* argv[]) { HANDLE outputHandle = GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleTextAttribute(outputHandle, 0xf0); printf("白底黑字\n"); SetConsoleTextAttribute(outputHandle, 0x4e); printf("红底黄字\n"); SetConsoleTextAttribute(outputHandle, 0x1a); printf("蓝底绿字\n"); SetConsoleTextAttribute(outputHandle, 0x801a); printf("蓝底绿字 + 下划线\n"); SetConsoleTextAttribute(outputHandle, 0x4e | COMMON_LVB_UNDERSCORE); printf("红底黄字 + 下划线\n"); SetConsoleTextAttribute(outputHandle, 0x07); printf("黑底灰字\n"); return 0; }
此 API 在新旧版控制台均能工作。
Windows 还提供了其它的样式。下方内容摘自 consoleapi2.h
// // Attributes flags: // #define FOREGROUND_BLUE 0x0001 // text color contains blue. #define FOREGROUND_GREEN 0x0002 // text color contains green. #define FOREGROUND_RED 0x0004 // text color contains red. #define FOREGROUND_INTENSITY 0x0008 // text color is intensified. #define BACKGROUND_BLUE 0x0010 // background color contains blue. #define BACKGROUND_GREEN 0x0020 // background color contains green. #define BACKGROUND_RED 0x0040 // background color contains red. #define BACKGROUND_INTENSITY 0x0080 // background color is intensified. #define COMMON_LVB_LEADING_BYTE 0x0100 // Leading Byte of DBCS #define COMMON_LVB_TRAILING_BYTE 0x0200 // Trailing Byte of DBCS #define COMMON_LVB_GRID_HORIZONTAL 0x0400 // DBCS: Grid attribute: top horizontal. #define COMMON_LVB_GRID_LVERTICAL 0x0800 // DBCS: Grid attribute: left vertical. #define COMMON_LVB_GRID_RVERTICAL 0x1000 // DBCS: Grid attribute: right vertical. #define COMMON_LVB_REVERSE_VIDEO 0x4000 // DBCS: Reverse fore/back ground attribute. #define COMMON_LVB_UNDERSCORE 0x8000 // DBCS: Underscore. #define COMMON_LVB_SBCSDBCS 0x0300 // SBCS or DBCS flag.
在 cmd 中使用 “color /?” 命令可以查看十六进制表示下颜色的排列,方法可在 【C++】Windows控制台API基本使用(下) 查阅。
二、使用ANSI转义序列
下方代码将会演示使用 ANSI 转义序列输出多样式文本。
#include <stdio.h> int main(int argc, char* argv[]) { printf("\x1b[31mText\x1b[0m\n"); printf("\x1b[31;1mText\x1b[0m\n"); printf("\x1b[31;1;47;4mText\x1b[0m\n"); printf("\x1b[31;1;7mText(反色)\x1b[0m\n"); return 0; }
这种写法在旧版控制台无效。八、控制台窗口标题
一、获取控制台窗口标题
GetConsoleTitle 函数可以获取窗口的标题。其原型为:
WINBASEAPI DWORD WINAPI GetConsoleTitleA( _Out_writes_(nSize) LPSTR lpConsoleTitle, _In_ DWORD nSize ); WINBASEAPI DWORD WINAPI GetConsoleTitleW( _Out_writes_(nSize) LPWSTR lpConsoleTitle, _In_ DWORD nSize ); #ifdef UNICODE #define GetConsoleTitle GetConsoleTitleW #else #define GetConsoleTitle GetConsoleTitleA #endif // !UNICODE
上方截取了 consoleapi2.h 中有关 (旧API)GetConsoleTitle 的部分。在宏 UNICODE 存在时,GetConsoleTitle 为 GetConsoleTitlteW,否则为 GetConsoleTitleA。GetConsoleTitleW 是 GetConsoleTitle 的
宽字符
版,而 GetConsoleTitleA 是摘字符
版。在源文件中取消宏 UNICODE 就能使用 ANSI 版。下面的代码演示了如何正确使用 GetConsoleTitleA 和 GetConsoleTitleW。#include <stdio.h> #include <wchar.h> #include <Windows.h> int main(int argc, char* argv[]) { char titleA[30] = ""; wchar_t titleW[30] = L""; GetConsoleTitle (titleW, 30); GetConsoleTitleA(titleA, 30); printf("titleA = %s\n" "titleW = %ls\n", titleA, titleW); return 0; }
Windows API 定义了不同的字符串类型,下方截取了 GetConsoleTitle 及其宽字符和窄字符版所用到的类型的定义。// 截取自 Winnt.h typedef _Null_terminated_ CHAR *NPSTR, *LPSTR, *PSTR; typedef _Null_terminated_ WCHAR *NWPSTR, *LPWSTR, *PWSTR;
二、设置窗口标题
一、使用旧版API
(旧API)SetConsoleTitle 可以设置窗口标题,与 (旧API)GetConsoleTitle 一样,它也分宽字符和窄字符两种版本。下方代码演示了如何使用这些 API。
#include <stdio.h> #include <wchar.h> #include <Windows.h> int main(int argc, char* argv[]) { char titleA[] = "titleA"; wchar_t titleW[] = L"titleW"; SetConsoleTitleA(titleA); printf("TitleA.\n"); getchar(); // 或在宏 UNICODE 存在时使用 SetConsoleTitle(titleW); SetConsoleTitleW(titleW); printf("TitleW.\n"); return 0; }
二、使用转义序列
Windows 新版控制台支持使用转义序列控制控制台窗口标题,其格式为:
\033]0;标题字符串\007
转义序列的标题使用响铃字符(ASCII: 7)为结尾,下方代码演示了此转义序列。
#include <stdio.h> int main() { printf("\033]0;新标题\007"); return 0; }
三、获取控制台原始标题
(旧API)GetConsoleOriginalTitle 函数可以获取控制台的原始标题。此函数也分宽字符和窄字符两种版本,其参数与 (旧API)GetConsoleTitle 的参数一样。下面的程序将会演示其功能。
#include <iostream> #include <Windows.h> int main(int argc, char* argv[]) { using std::cout; HANDLE outputHandle = GetStdHandle(STD_OUTPUT_HANDLE); // 设置新标题 SetConsoleTitleA("新标题"); char originalTitle[50] = ""; GetConsoleOriginalTitleA(originalTitle, 50); cout << "原始标题: " << originalTitle << std::endl; return 0; }
(旧API)GetConsoleOriginalTitle 在 (旧API)SetConsoleTitle 后调用,但 (旧API)GetConsoleOriginalTitle 获取的标题不是现在的新标题,而是开始的标题。九、置顶窗口
SetWindowPos 函数可以实现此功能。其原型为:
// 摘自 WinUser.h WINUSERAPI BOOL WINAPI SetWindowPos( _In_ HWND hWnd, // 要操作的窗口 _In_opt_ HWND hWndInsertAfter, _In_ int X, // 窗口新的位置的X轴 _In_ int Y, // 窗口新的位置的Y轴 _In_ int cx, // 窗口的新宽度 _In_ int cy, // 窗口的新高度 _In_ UINT uFlags // 附加属性;
uFlags将决定 X、Y、cx 和 cy 四个参数是否生效。下方代码演示了如何置顶和不置顶窗口。
#include <stdio.h> #include <Windows.h> int main(int argc, char* argv[]) { // 获取控制台窗口的句柄 HWND window = GetConsoleWindow(); // 置顶窗口 SetWindowPos(window, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); // 不置顶窗口 SetWindowPos(window, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); /* SetWindowPos 函数的 uFlags 参数如果包括 SWP_NOMOVE,则 X 和 Y 参数不生效,窗口就不会移动。 如果包含 SWP_NOSIZE,则窗口大小不会被重新定义。 */ return 0; }
上述代码中 window 是一个控制台窗口对象(或窗口句柄),GetConsoleWindow 将会返回控制台窗口的句柄。调用 SetWindowPos 时传递了控制台窗口的句柄,则接下来要操作的就是控制台窗口。
与 GetConsoleWindow 的 API 是 GetForegroundWindow 函数,它也能返回窗口句柄,但其返回的是当前焦点所在的窗口的句柄。
上图中正在被操作的窗口就是当前焦点所在窗口。
下方程序演示了置顶当前焦点所在窗口。#include <stdio.h> #include <Windows.h> int main(int argc, char* argv[]) { // 获取当前焦点所在窗口的句柄 HWND window = GetForegroundWindow(); // 置顶窗口 SetWindowPos(window, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); return 0; }
十、移动窗口
SetWindowPos 依然能够实现此功能。刚才讲过,若 uFlags 包含 SWP_NOMOVE 则指定窗口不会移动,忽略参数 X 和 Y,如果去掉就可以实现移动窗口。下方代码演示了此功能。
#include <stdio.h> #include <stdlib.h> #include <Windows.h> int main(int argc, char* argv[]) { // 获取控制台窗口 HWND window = GetConsoleWindow(); // 获取到的坐标 unsigned int getPos[2] = {0}; while (1) { // 获取 X 轴 printf("X:"); scanf("%ud", &getPos[0]); // 获取 Y 轴 printf("Y:"); scanf("%ud", &getPos[1]); getchar(); // 移动窗口 SetWindowPos(window, NULL, getPos[0], getPos[1], 0, 0, SWP_NOSIZE); printf("\n"); } return 0; }
十一、(旧API)ScrollConsoleScreenBuffer
(旧API)ScrollConsoleScreenBuffer 函数可以移动控制台指定区域的文本到制定区域,其原型为:
// 摘自 Microsoft Docs BOOL WINAPI ScrollConsoleScreenBuffer( _In_ HANDLE hConsoleOutput, _In_ const SMALL_RECT *lpScrollRectangle, _In_opt_ const SMALL_RECT *lpClipRectangle, _In_ COORD dwDestinationOrigin, _In_ const CHAR_INFO *lpFill );
Microsoft Docs 这么描述:
参数
hConsoleOutput[in]
控制台屏幕缓冲区的句柄。 句柄必须具有 GENERIC_READ 访问权限。 有关详细信息,请参阅控制台缓冲区安全性和访问权限。lpScrollRectangle [in]
指向 SMALL_RECT 结构的指针,该结构的成员指定要移动的控制台屏幕缓冲区矩形的左上角和右下角坐标。lpClipRectangle [in,可选]
指向 SMALL_RECT 结构的指针,该结构的成员指定受滚动影响的控制台屏幕缓冲区矩形的左上角和右下角坐标。 此指针可以为 NULL。dwDestinationOrigin [in]
指定lpScrollRectangle内容的新位置的左上角的oozie.coord.application.path结构,以字符为字符。lpFill [in]
一个指向 CHAR_INFO 结构的指针,该结构指定用于填充 lpScrollRectangle 和 lpClipRectangle 的交集中的单元格的字符和颜色属性,这些单元格在移动后留空。此 API 的更多信息请访问 【C++】Windows控制台API基本使用(下) 有关移动控制台文本的章节。
十二、清空控制台
Microsoft Docs 提供了 Cmd 中 cls 指令清除控制台的代码。
#include <windows.h> void cls(HANDLE hConsole) { CONSOLE_SCREEN_BUFFER_INFO csbi; SMALL_RECT scrollRect; COORD scrollTarget; CHAR_INFO fill; // Get the number of character cells in the current buffer. if (!GetConsoleScreenBufferInfo(hConsole, &csbi)) { return; } // Scroll the rectangle of the entire buffer. scrollRect.Left = 0; scrollRect.Top = 0; scrollRect.Right = csbi.dwSize.X; scrollRect.Bottom = csbi.dwSize.Y; // Scroll it upwards off the top of the buffer with a magnitude of the entire height. scrollTarget.X = 0; scrollTarget.Y = (SHORT)(0 - csbi.dwSize.Y); // Fill with empty spaces with the buffer's default text attribute. fill.Char.UnicodeChar = TEXT(' '); fill.Attributes = csbi.wAttributes; // Do the scroll ScrollConsoleScreenBuffer(hConsole, &scrollRect, NULL, scrollTarget, &fill); // Move the cursor to the top left corner too. csbi.dwCursorPosition.X = 0; csbi.dwCursorPosition.Y = 0; SetConsoleCursorPosition(hConsole, csbi.dwCursorPosition); } int main(void) { HANDLE hStdout; hStdout = GetStdHandle(STD_OUTPUT_HANDLE); cls(hStdout); return 0; }
十三、控制台字体
一、获取控制台字体
若要更改或获取控制台字体,应在代码中添加下方代码块:
struct CONSOLE_FONT { DWORD index; COORD dim; }; typedef BOOL(WINAPI* PROCSETCONSOLEFONT)(HANDLE, DWORD); typedef BOOL(WINAPI* PROCGETCONSOLEFONTINFO)(HANDLE, BOOL, DWORD, CONSOLE_FONT*); typedef COORD(WINAPI* PROCGETCONSOLEFONTSIZE)(HANDLE, DWORD); typedef DWORD(WINAPI* PROCGETNUMBEROFCONSOLEFONTS)(); typedef BOOL(WINAPI* PROCGETCURRENTCONSOLEFONT)(HANDLE, BOOL, CONSOLE_FONT*); PROCSETCONSOLEFONT SetConsoleFont; PROCGETCONSOLEFONTINFO GetConsoleFontInfo; PROCGETNUMBEROFCONSOLEFONTS GetNumberOfConsoleFonts; typedef BOOL(WINAPI* PROCGETCONSOLEDISPLAYMODE)(LPDWORD); typedef BOOL(WINAPI* PROCSETCONSOLEDISPLAYMODE)(HANDLE, DWORD, LPDWORD);
例如:
#include <Windows.h> #include <stdio.h> struct CONSOLE_FONT { DWORD index; COORD dim; }; typedef BOOL(WINAPI* PROCSETCONSOLEFONT)(HANDLE, DWORD); typedef BOOL(WINAPI* PROCGETCONSOLEFONTINFO)(HANDLE, BOOL, DWORD, CONSOLE_FONT*); typedef COORD(WINAPI* PROCGETCONSOLEFONTSIZE)(HANDLE, DWORD); typedef DWORD(WINAPI* PROCGETNUMBEROFCONSOLEFONTS)(); typedef BOOL(WINAPI* PROCGETCURRENTCONSOLEFONT)(HANDLE, BOOL, CONSOLE_FONT*); PROCSETCONSOLEFONT SetConsoleFont; PROCGETCONSOLEFONTINFO GetConsoleFontInfo; PROCGETNUMBEROFCONSOLEFONTS GetNumberOfConsoleFonts; typedef BOOL(WINAPI* PROCGETCONSOLEDISPLAYMODE)(LPDWORD); typedef BOOL(WINAPI* PROCSETCONSOLEDISPLAYMODE)(HANDLE, DWORD, LPDWORD); int main(int argc, char* argv[]) { printf("Hello world!\n"); return 0; }
GetCurrentConsoleFontEx 函数可以获取字体信息,其原型为:
WINBASEAPI BOOL WINAPI GetCurrentConsoleFontEx( _In_ HANDLE hConsoleOutput, // 输出句柄。 _In_ BOOL bMaximumWindow, // 如果此参数为 TRUE,则为最大窗口大小检索字体信息。 如果此参数为 FALSE,则将检索当前窗口大小的字体信息。 _Out_ PCONSOLE_FONT_INFOEX lpConsoleCurrentFontEx // 字体结构体 );
参数 lpConsoleCurrentFontEx 的类型 PCONSOLE_FONT_INFOEX 是一个指向 CONSOLE_FONT_INFOEX 的指针,CONSOLE_FONT_INFOEX 的定义为:
typedef struct _CONSOLE_FONT_INFOEX { ULONG cbSize; // 结构体的大小(以字节为单位)。 DWORD nFont; // 系统控制台字体表中字体的索引。 COORD dwFontSize; // 字体大小,规定了字体的长与宽。 UINT FontFamily; // 字体间距和系列。 UINT FontWeight; // 字体粗细。权重的范围可以是 100 到 1000,以 100 的倍数表示。 WCHAR FaceName[LF_FACESIZE]; // 字体名称。 } CONSOLE_FONT_INFOEX, *PCONSOLE_FONT_INFOEX;
在调用 GetCurrentConsoleFontEx 前必须设置 cbSize 的值,否则函数调用失败。其值可以设为 sizeof(CONSOLE_FONT_INFOEX),下方代码将会演示如何使用此函数和结构。
#include <iostream> #include <Windows.h> int main(int argc, char* argv[]) { using std::cout; using std::wcout; // 控制台字体对象 CONSOLE_FONT_INFOEX cfi; cfi.cbSize = sizeof(cfi); // 输出句柄 HANDLE outputHandle = GetStdHandle(STD_OUTPUT_HANDLE); // 获取字体信息 GetCurrentConsoleFontEx(outputHandle, 0, &cfi); // 输出字体信息 wcout << "字体: " << cfi.FaceName; cout << std::endl; cout << "大小: " << cfi.dwFontSize.X << "*" << cfi.dwFontSize.Y << std::endl << "权重: " << cfi.FontWeight << std::endl; return 0; }
不知道为什么,无法获取到控制台字体。二、设置控制台字体
(旧版API)SetCurrentConsoleFontEx 函数可以修改字体,需要搭配 (旧版结构)CONSOLE_FONT_INFOEX 结构体使用。下方的程序将会演示此功能。
/* 此程序将会演示如何使用 SetCurrentConsoleFontEx 函数更改控制台字体为“楷体”。 有一点需要注意,更改的字体必须是等宽字体,不是等宽字体的修改后都会变成默认字体。 */ #include <stdio.h> #include <Windows.h> int main(int argc, char* argv[]) { // 控制台字体对象 CONSOLE_FONT_INFOEX cfi; cfi.cbSize = sizeof(cfi); // 不要忘记设置结构体的大小 // 输出句柄 HANDLE outputHandle = GetStdHandle(STD_OUTPUT_HANDLE); printf("字体会在按下回车后更改。\n"); getchar(); // 更改字体 cfi.nFont = 0; cfi.dwFontSize.X = 8; // 更改字体宽度 cfi.dwFontSize.Y = 18; // 更改字体高度 cfi.FontFamily = FF_DONTCARE; cfi.FontWeight = FW_NORMAL; wcscpy_s(cfi.FaceName, L"黑体"); // 更改字体名 SetCurrentConsoleFontEx(outputHandle, FALSE, &cfi); // 应用更改 printf("更改完毕。\n"); return 0; }
三、字体无法使用
某些字体可能无法被应用,这可能是由以下原因引发的:
1. 参数未正确设置。
2. 字体不支持当前代码页。一、参数未正确设置
请检查代码中是否正确设置控制台字体对象的 cbSize 成员,如果有,那就是因为其它项没有正确设置。
程序需要设置所使用字体的各种信息,如权重、名称、大小等,如果您不知道如何设置它们,可以考虑从当前设置中设置。也就是在使用 (旧版API)SetCurrentConsoleFontEx 前先调用 GetCurrentConsoleFontEx,下面是上方代码的改进。#include <stdio.h> #include <Windows.h> int main(int argc, char* argv[]) { // 控制台字体对象 CONSOLE_FONT_INFOEX cfi; cfi.cbSize = sizeof(cfi); // 不要忘记设置结构体的大小 // 输出句柄 HANDLE outputHandle = GetStdHandle(STD_OUTPUT_HANDLE); // 获取字体 GetCurrentConsoleFontEx(outputHandle, 0, &cfi); printf("字体会在按下回车后更改。\n"); getchar(); // 更改字体 cfi.dwFontSize.X = 8; // 更改字体宽度 cfi.dwFontSize.Y = 18; // 更改字体高度 cfi.FontFamily = FF_DONTCARE; cfi.FontWeight = FW_NORMAL; wcscpy_s(cfi.FaceName, L"Sarasa Fixed Slab SC Semibold"); // 更改字体名 SetCurrentConsoleFontEx(outputHandle, FALSE, &cfi); // 应用更改 printf("更改完毕。\n"); return 0; }
附录 - 后篇链接
-
Windows控制台常用命令
2020-10-25 14:26:44总结下控制台中常用的命令,后面遇到好用的命令再持续更新吧 正文 WIndows下命令提示符CMD(Command)常用命令汇总 功能 操作 举例 备注 切换盘符 盘符名称: D: 进入D盘 进入文件夹 cd 文件夹名称 cd ... -
Windows Powershell 自定义控制台
2021-01-20 16:25:26“选项”设置光标,历史记录,编辑模式的切换。“字体”设置字体的名称和大小“布局”设置窗口的缓冲区、窗口的大小、窗口起始坐标“颜色”设置屏幕和对话框的背景色和前景色。... 您可能感兴趣的文章:Windows Powershe -
windows 控制台操作命令
2021-02-01 12:29:59打开"运行"对话框(Win+R),输入cmd,打开控制台命令窗口 在运行对话框中可以通过cmd /c 命令 和 cmd /k 命令 的方式来直接运行命令 /c表示执行完命令后关闭cmd窗口;/k表示执行完命令后保留cmd窗口 右键弹出快捷... -
conemu 代替 windows 控制台
2016-03-16 10:17:44conemu 代替 windows 控制台,多标签 ConEmu-Maximus5 is a Windows console window enhancement (local terminal emulator), which presents multiple consoles and simple GUI applications as one customizable ... -
winpty:Windows软件包,提供与Unix pty-master相似的界面,用于与Windows控制台程序进行通信
2021-04-05 23:24:46winpty是Windows软件包,提供与Unix pty-master类似的界面,用于与Windows控制台程序进行通信。 该软件包包括一个库(libwinpty)和一个用于Cygwin和MSYS的工具,用于在Cygwin / MSYS pty中运行Windows控制台程序。... -
windows控制台常用命令解释
2013-06-24 00:24:40列出了windows常用的几个控制台命令,还有详细的解析 -
Windows控制台清屏
2020-02-22 15:58:57在Windows控制台编程中,我们有时需要清空屏幕,以便显示的需要 清屏有两种方法,最简单的一种 system("cls"); 较为复杂的是调用Windows API 在之前,首先要弄清清屏的概念,清屏相当于填充空格字符,然后将光标设为{0,0}... -
操作系统——Windows 控制台命令
2020-10-30 10:45:59Windows 控制台命令 预 习 报 告 实验题目:Windows 控制台命令 预习内容: 1.window自有的操作命令:⑴系统消息命令 、⑵系统操作命令、⑶文件系统命令、⑷网络通信命令 2.常用的API函数调用:⑴窗口管理类、⑵图形... -
windows控制台cmd查看wifi密码
2022-02-03 13:20:46把name后面引号里1改成你连接的WiFi名 netsh wlan show profile name="wifi名字" key=clear -
gsudo:适用于Windows的Sudo-在运行时提升而不会产生新的控制台主机窗口
2021-02-06 04:55:00为什么使用gsudo而不是some-other-sudo ? gsudo非常易于安装和使用,并具有更多功能。 它与Unix / Linux sudo的相似之处使体验变得轻而易举。 产品特点 提升的命令显示在当前用户级别的控制台中。 没有新窗 -
Windows控制台的打开方式
2020-06-29 22:41:501、键盘上 Windows+R 键 输入cmd即可打开控制台 2、在需要打开的文件夹下,按住shift+单击右键,选择在此处打开命令窗口。(极力推荐该方法,终端路径直接就是该文件夹) 3、在桌面Windows图标上(单击右键)... -
windows 控制台进入 mysql
2021-07-26 17:34:28方法1 在mysql下的bin目录 输入 无密码 mysql -u root -r 有密码 mysql -u root -p 方法2 配置系统path环境变量,然后在任意目录都能用上面命令进入数据库 效果 -
Windows控制台仿真器Cmder.zip
2019-07-17 06:56:46cmder 是为 Windows 提供的一个便携式控制台仿真器。使用非常简单,只需下载解压后执行 cmder.bat 即可。 标签:Cmder -
控制台收发windows message
2014-10-15 11:44:49控制台应用程序发送接收windows消息