在Win程序中添加控制台窗口方法汇总

合集下载

windows命令行调用控制面板程序

windows命令行调用控制面板程序

从网络收集的在Windows 7下可以使用的各个命令语句:control.exe /name microsoft.folderoptions 启动资源管理器的文件夹属性选项卡control.exe /name Microsoft.AddHardware 控制面板\所有控制面板项\设备和打印机control.exe /name Microsoft.AdministrativeTools 控制面板\所有控制面板项\管理工具control.exe /name Microsoft.PeopleNearMe 网络邻居control.exe /name Microsoft.AudioDevicesAndSoundThemes 声音control.exe /name Microsoft.AutoPlay 控制面板\所有控制面板项\自动播放control.exe /name Microsoft.Personalization 控制面板\所有控制面板项\个性化control.exe /name Microsoft.BackupAndRestoreCenter 控制面板\所有控制面板项\备份和还原control.exe /name Microsoft.PhoneAndModemOptions 设置电话和调制调解器的连接向导:位置信息control.exe /name Microsoft.BitLockerDriveEncryption 控制面板\所有控制面板项\BitLocker 驱动器加密control.exe /name Microsoft.Printers 控制面板\所有控制面板项\设备和打印机control.exe /name Microsoft.ColorManagement 颜色管理control.exe /name Microsoft.ProgramsAndFeatures 控制面板\所有控制面板项\程序和功能:添加/删除程序control.exe /name Microsoft.DateAndTime 日期和时间control.exe /name Microsoft.DefaultPrograms 控制面板\所有控制面板项\默认程序control.exe /name Microsoft.DeviceManager 设备管理器control.exe /name Microsoft.SecurityCenter 安全中心:控制面板\所有控制面板项\操作中心control.exe /name Microsoft.SyncCenter 控制面板\所有控制面板项\同步中心control.exe /name Microsoft.Fonts 控制面板\所有控制面板项\字体control.exe /name Microsoft.System 控制面板\所有控制面板项\系统:查看Windows版本等control.exe /name Microsoft.GameControllers 游戏控制器control.exe /name Microsoft.GetPrograms 控制面板\程序\获得程序control.exe /name Microsoft.TaskbarAndStartMenu 任务栏和“开始”菜单属性control.exe /name erAccounts 控制面板\所有控制面板项\用户帐户control.exe /name Microsoft.WelcomeCenter 控制面板\所有控制面板项\入门control.exe /name Microsoft.iSCSIInitiator iSCSI 发起程序属性control.exe /name Microsoft.WindowsDefender 启动Windows Defendercontrol.exe /name Microsoft.Keyboard 启动键盘属性对话框control.exe /name Microsoft.WindowsFirewall 控制面板\所有控制面板项\Windows 防火墙control.exe /name Microsoft.MobilityCenter Windows 移动中心control.exe /name Microsoft.Mouse 鼠标属性control.exe /name workAndSharingCenter 控制面板\所有控制面板项\网络和共享中心control.exe /name Microsoft.WindowsUpdate 控制面板\所有控制面板项\Windows Update control.exe /name Microsoft.OfflineFiles 脱机文件control.exe /name Microsoft.ParentalControls 控制面板\所有控制面板项\家长控制compmgmt.msc 计算机管理devmgmt.msc 设备管理器diskmgmt.msc 磁盘管理实用程序(可以进行有损分区)wmimgmt.msc 打开windows管理体系结构(WMI):Wmimgmt-[控制台根节点\WMI控件(本地)] certmgr.msc 证书管理实用程序secpol.msc 本地安全策略services.msc 本地服务设置sysdm.cpl 系统属性:类似WinXP等右击“我的电脑”后选择的“属性”telephon.cpl 设置电话和调制调解器的连接向导:位置信息wscui.cpl 安全中心:控制面板\所有控制面板项\操作中心timedate.cpl 时间/日期属性appwiz.cpl 控制面板\所有控制面板项\程序和功能:安装、反安装程序添加/删除程序inetcpl.cpl Internet属性intl.cpl 区域和语言选项(输入法选项):控制属性:常规文字种类、数字、货币、时间、日期、输入法区域设置joy.cpl 游戏选项mmsys.cpl 声音和音频设备:声音/多媒体属性ncpa.cpl 控制面板\所有控制面板项\网络连接powercfg.cpl 控制面板\所有控制面板项\电源选项desk.cpl 控制面板\所有控制面板项\显示\屏幕分辨率main.cpl 鼠标选项firewall.cpl WINDOWS防火墙:控制面板\所有控制面板项\Windows 防火墙odbccp32.cpl ODBC数据源管理器winver 检查Windows版本wiaacmgr 扫描仪和照相机向导cmd CMD命令提示符command CMD命令提示符nslookup IP地址侦测器osk 打开屏幕键盘calc 启动计算器charmap 启动字符映射表cliconfg SQLSERVER客户端网络实用程序control 打开控制面板:控制面板\所有控制面板项msconfig 系统配置实用程序mplayer2 简易widnows media player 媒体播放机mspaint 画图板shutdown 关机命令(详细请在cmd中输入shutdown/?)mobsync 控制面板\所有控制面板项\同步中心dxdiag 检查directx信息,还可以查看系统基本配置信息gpedit.msc 组策略(Home Basic受限)lusrmgr.msc 本地用户和组(本地)perfmon.msc 计算机性能监测程序dcomcnfg 打开系统组件服务sysedit 系统配置编辑器sigverif 文件签名验证程序SoundRecorder 系统自带录音机SnippingTool 系统自带截图工具odbcad32 ODBC数据源管理器syskey 系统加密,一旦加密就不能解开,保护windows 7系统的双重密码sfc.exe 系统文件检查器,需要管理员权限启动cmd,并在命令行中输入命令及参数扫描所有受保护的系统文件的完整性,并用正确的 Microsoft 版本替换不正确的版本。

电脑小黑窗高级操作方法

电脑小黑窗高级操作方法

电脑小黑窗高级操作方法电脑小黑窗是指Windows操作系统下的命令行界面,也被称作控制台窗口。

它是一种通过文本输入命令来操作计算机的方式,与图形用户界面相比,小黑窗不需要鼠标操作,更加灵活、高效、精准,所以经常被用来进行高级操作。

本文将介绍小黑窗的高级操作方法。

二、进入小黑窗在Windows操作系统下,打开小黑窗通常有以下几种方式:1. 使用Win+R快捷键,打开运行对话框,输入cmd后按下回车键,即可打开小黑窗。

2. 在Windows资源管理器中,按下Alt键,在菜单栏选择“文件”-“新建”-“命令提示符”。

3. 在Windows资源管理器中,进入任意一个文件夹,按下Shift键,同时右键单击,选择“在此处打开命令窗口”。

以上三种方式,任选一种即可快速进入小黑窗。

三、高级操作命令1. ping 命令ping命令可以测试本地计算机与指定主机之间的连接状态。

具体用法是在小黑窗中输入ping加上要测试的主机IP地址或域名,如“ping2. tracert 命令tracert命令用于跟踪数据包的路由路径,并衡量到达每个路由器所需的时间。

使用方法是在小黑窗中输入tracert加上要跟踪的主机IP地址或域名,如“tracert3. netstat 命令netstat命令用于显示本地计算机当前的TCP/IP网络连接状态。

使用方法是在小黑窗中输入netstat,按下回车键观察结果即可。

4. nslookup 命令nslookup命令可以查询指定主机的DNS(域名解析服务器)记录。

使用方法是在小黑窗中输入nslookup加上要查询的域名,如“nslookup5. ipconfig 命令ipconfig命令可以显示本地计算机的IP地址、子网掩码、默认网关、DNS服务器以及各个网络接口的状态。

使用方法是在小黑窗中输入ipconfig,按下回车键观察结果即可。

6. tasklist 命令tasklist命令可以显示当前正在运行的所有进程的详细信息,包括进程ID、进程名称、内存占用和CPU占用率等。

打开控制面板DOS命令和RUNDLL32使用大全

打开控制面板DOS命令和RUNDLL32使用大全

命令: rundll32.exe shell32.dll,Control_RunDLL main.cpl @4
结果: 显示电源管理属性。
增加 Modem
模块:modem.cpl
命令: rundll32.exe shell32.dll,Control_RunDLL modem.cpl,,add
Run(“rundll32.exe shell32.dll,Control_RunDLL desk.cpl,,4”)
结果: 第一行为显示属性的屏幕保护程序页,第二行为显示属性的设置页,另外desk.cpl模块中只有一个显示属性,所以加不加@0,都没有关系。
第二种方法:
运行control.exe程序就能调出控制面板窗口
结果: 背景设置。
命令: rundll32.exe shell32.dll,Control_RunDLL desk.cpl,,1
结果: 屏幕保护设置。
命令: rundll32.exe shell32.dll,Control_RunDLL desk.cpl,,2
结果: 外观设置。
命令: rundll32.exe shell32.dll,Control_RunDLL sysdm.cpl,,0
结果: 显示常规设置。
命令: rundll32.exe shell32.dll,Control_RunDLL sysdm.cpl,,1
结果: 显示设备管理设置。
命令: rundll32.exe shell32.dll,Control_RunDLL sysdm.cpl,,2
结果:高级。
命令: rundll32.exe shell32.dll,Control_RunDLL mmsys.cpl @1

用于直接打开小程序的windows11控制面板命令

用于直接打开小程序的windows11控制面板命令

用于直接打开小程序的windows11控制面板命令用于直接打开小程序的windows11控制面板命令下面是Windows11控制面板命令的列表,可以直接打开小程序。

可以在“运行”对话框中键入这些命令,也可以为此类命令创建快捷方式。

快捷方式允许您更快地打开“控制面板”项目,或将固定到“开始”或“任务栏”。

这个经典控制面板在Windows 11中起次要作用。

其大多数选项已在现代设置应用程序中可用。

通过继续这一改变,微软已经删除了大部分到旧版applet的链接,这使得普通用户很难发现它们。

这就是Windows11控制面板命令发挥作用的地方。

通过使用它们,您可以直接访问大多数遗留小程序。

例如,如果您键入appwiz.cpl在“运行”对话框中,您将看到经典卸载程序对话下面是Windows11中可用的经典控制面板命令的列表。

Windows 11控制面板命令♦直接打开控制面板小程序1. win+R在键盘上打开跑对话2. 从上表中键入或复制粘贴命令,例如,OptionalFeatures.exe .3. 按Enter进入执行它的键。

这将立即打开小程序;在我们的情况下Windows功能对话此外,您还可以使用上面的Windows11控制面板命令,通过几次单击为任何小程序或工具创建快捷方式。

以这种方式创建的快捷方式可以很容易地固定到「开始」菜单或任务栏上。

♦创建控制面板小程序的快捷方式1.右键单击桌面上的空白区域。

2. 从上下文菜单中选择“新建项目”>“快捷方式”。

3. 从上表中为要创建快捷方式的项键入或复制粘贴命令。

例如,control appwiz.cpl .4. 命名快捷方式以反映它的功能,例如“卸载程序”。

5.如有必要,自定义快捷图标。

最后,需要注意的是,有一种更简单的方法可以为任何控制面板小程序创建快捷方式。

只要打开它,把它的图标从控制面板的地址栏拖放到桌面上。

这将立即创建一个小程序快捷方式。

但是,如果你试图锁定任务栏,它将锁定控制面板本身,而不是单个小程序。

windows下控制台程序实现窗口显示

windows下控制台程序实现窗口显示

windows下控制台程序实现窗⼝显⽰windows下实现窗⼝显⽰,如果限定是C/C++语⾔,并且是原⽣Windows⽀持,需要使⽤GDI或GDI+。

⼀般是在Visual Studio⾥新建Win32应⽤程序,⽽不是Win32 console application(控制台程序),然后使⽤GDI的⼀些API,例如CreateWindow、CreateWindowEx来实现窗⼝的创建、显⽰等。

实际上MSDN官⽅并没有说只能是Win32应⽤程序,控制台程序完全可以。

个⼈并不习惯WinMain()函数,更习惯main(int argc, char** argv)。

例如OpenCV的highgui模块,它⾥⾯的cvNamedWindow(), cvShowImage(), cvWaitKey()这⼏个函数,在windows下的实现,如果不考虑其opengl版本的话,它是基于GDI实现的;⽽作为⼀个⼴泛使⽤的图像处理库,OpenCV源码中并没有WinMain函数。

第1种实现下⾯是⽤纯C实现的“调⽤GDI的API接⼝,实现控制台类型程序中显⽰窗⼝”的样例程序,改编⾃#include <stdio.h>#include <windows.h>LRESULT __stdcall WindowProcedure(HWND window, unsigned int msg, WPARAM wp, LPARAM lp){switch(msg){case WM_DESTROY:printf("\ndestroying window\n");PostQuitMessage(0) ;return 0L ;case WM_LBUTTONDOWN:printf("\nmouse left button down at (%d, %d)\n", LOWORD(lp), HIWORD(lp));// fall thrudefault:printf(".");return DefWindowProc( window, msg, wp, lp ) ;}}typedef struct MyRect{int x, y, width, height;} MyRect;int main(){printf("hello world!\n");const char* const myclass = "myclass" ;WNDCLASSEX wc;wc.cbSize = sizeof(WNDCLASSEX);/* Win 3.x */wc.style = CS_DBLCLKS;wc.lpfnWndProc = WindowProcedure;wc.cbClsExtra = 0;wc.cbWndExtra = 0;wc.hInstance = GetModuleHandle(0);wc.hIcon = LoadIcon(0, IDI_APPLICATION);wc.hCursor = LoadCursor(0, IDC_ARROW);wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);wc.lpszMenuName = 0;wc.lpszClassName = myclass;/* Win 4.0 */wc.hIconSm = LoadIcon(0, IDI_APPLICATION);if(RegisterClassEx(&wc)){MyRect rect;rect.x = 300;rect.y = 300;rect.width = 640;rect.height = 480;HWND window = CreateWindowEx( 0, myclass, "title",WS_OVERLAPPEDWINDOW, rect.x, rect.y,rect.width, rect.height, 0, 0, GetModuleHandle(0), 0 ) ;if(window){ShowWindow( window, SW_SHOWDEFAULT ) ;MSG msg ;while( GetMessage( &msg, 0, 0, 0 ) ) DispatchMessage(&msg);}}}第2种实现实际上,在Visual Studio中通过“菜单栏”->"⽂件"->“新建项⽬”->"Win32项⽬"(或"Win32控制台项⽬"进⼊后再选“Windows应⽤程序”),创建的“Hello World”⼯程提供的代码也仅仅是“显⽰⼀个窗⼝”,只不过⼊⼝函数是WinMain,其内容如下:// gdi_show_png.cpp : 定义应⽤程序的⼊⼝点。

创建第一个C++Win32控制台应用程序

创建第一个C++Win32控制台应用程序

创建第一个C++的Win32控制台应用程序
1.打开VS2008,依次选择菜单:文件--→新建--→项目。

2.在新建项目窗口中,依次选择项目类型中的其他语言--→Visual C++ ----→Win32,选择模板中的Win32控制台应用程序。

在名称栏中输入项目名称 Win32ConsoleApplicaiton,项目所在位置可单击浏览按钮选择目录位置。

选择完毕后,单击确定按钮。

3.在Win32应用程序向导中单击“下一步”
4.不用修改任何选项,单击“下一步”
5. 右侧是解决方案的资源管理器,双击文件名可以打开相应文件。

找到相应的main函数。

6.在main函数中输入相应的代码。

7.stdafx.h的作用,当我们使用AppWizard来自动生成某些项目的时候,系统会自动把所需要include的头文件在stdafx.h中先include一下,这样,我们只需要直接include这个stdafx.h文件即可.因为同一个项目中的不同源文件CPP都包含相同的include文件,这样,为每个.CPP文件都重复include这些文件就显得很傻了。

所以,在stdafx.h中填写头部文件。

在有main函数的文件中在添加代码:#include “stdafx.h”
即可。

8.按“Ctrl+F5”可以查看运行结果。

如果按F5或单击工具栏中的“”可以进行调试,
但无法保留最终运行结果。

设置控制台窗口界面

设置控制台窗口界面

怎样设置控制台窗口界面一、概述所谓控制台应用程序,就是指那些需要与传统DOS操作系统保持某种程序的兼容,同时又不需要为用户提供完善界面的程序。

简单地讲,就是指在Windows环境下运行的DOS程序。

一旦C++控制台应用程序在Windows 9x/NT/2000操作系统中运行后,就会弹出一个窗口。

例如下列过程:单击Visual C++标准工具栏上的“New Text File”按钮,打开一个新的文档窗口。

选择File | Save菜单或按快捷键Ctrl+S或单击标准工具栏的Save按钮,弹出“保存为”文件对话框。

将文件名为“Hello.cpp” (注意扩展名.cpp不能省略)。

在文档窗口中输入下列代码:#includevoid main(){cout<<"Hello, Console!"<}单击小型编译工具栏中的“Build”按钮或按F7键,系统出现一个对话框,询问是否将此项目的工作文件夹设定源文件所在的文件夹,单击[是]按钮,系统开始编译。

单击小型编译工具栏中的“Execute Program”按钮或按Ctrl+F5键,运行刚才的程序。

程序运行后,弹出下图的窗口。

这就是控制台窗口,与传统的DOS屏幕窗口相比最主要的区别有:(1) 默认的控制台窗口有系统菜单和标题,它是一个内存缓冲区窗口,缓冲区大小取决于Windows操作系统的分配;而DOS 屏幕是一种物理窗口,不具有Windows窗口特性,其大小取决于ROM BIOS分配的内存空间。

(2) 控制台窗口的文本操作是调用低层的Win32 APIs,而DOS屏幕的文本操作是通过调用BIOS的16(10h)中断而实现的。

(3) 默认的控制台窗口可以接收键盘和鼠标的输入信息,设备驱动由Windows管理,而DOS屏幕窗口接收鼠标时需要调用33h中断,且鼠标设备驱动程序由自己安装。

二、控制台文本窗口的一般控制步骤在Visual C++ 6.0中,控制台窗口界面的一般编程控制步骤如下:调用GetStdHandle获取当前的标准输入(STDIN)和标准输出(STDOUT)设备句柄。

操作“控制”菜单的命令

操作“控制”菜单的命令

操作“控制”菜单的命令
在windows操作系统中,每个应用程序都有一个控制菜单,今天店铺给大家介绍一下操作“控制”菜单的命令吧。

供大家参考!
电脑基础知识-操作“控制”菜单命令
参考如下:
在windows操作系统中,每个应用程序都有一个控制菜单。

提供还原、移动、大小、最大化、最小化、关闭窗口功能。

右击标题栏的任意位置,或单击标题栏左侧的图标即可弹出控制菜单。

同时按住alt +空格也可以弹出控制菜单。

每个程序都有的控制菜单具有相同的菜单命令。

双击“控制菜单”按钮可关闭窗口。

控制菜单图标的作用1关闭,2设备管理器,3管理,4资源管理器,5映射网络驱动器,6断开网络驱动器,7属性
具体
第一步:在桌面上双击“我的电脑”或打开任意窗口。

第二步:单击左上角的小图标,即打开控制菜单。

选定并单击某项即可执行该命令。

各命令的意思是:
1、“还原”。

用于在改变了窗口大小后回到原来大小。

2、“移动”。

用于改变窗口在屏幕上的位置。

单击该命令后,鼠标变成四箭头状,此时拖动标题栏即可在屏幕上移动窗口。

3、“大小”。

用于改变窗口尺寸。

单击该命令后,鼠标变成四箭头状,此时将鼠标移动到窗口四角或四边会变成双箭头状,拖动鼠标即可改变窗口大小。

4、“最小化”。

用于将窗口缩小到任务栏上。

5、“最大化”。

用于将窗口放大到全屏幕。

6、“关闭”。

用于关闭窗口,当然,也就等于退出程序或关闭文件。

店铺介绍了有关菜单命令操作常识的相关知识:,希望你喜欢。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

XDE(Xanavi Development Enveriment)的在PC机上运行的时候,除了模拟导航仪屏幕的对话框窗口外,还有一个用来协助调试的控制台(console)窗口。

这个console窗口可以用来输入调试命令,也可以进行打屏输出以观察程序的运行状态,非常方便。

这样做有两个好处:一、console窗口的输入输出速度比一般的windows窗口要快;二、console窗口的输入输出不会对消息流产生影响(你知道,就像dos窗口不知道消息的存在一样,console 窗口也具有这样的特性),而在一般的windows窗口上进行输入输出时,会打乱原有的消息流(因为会有一大堆的像WM_PAINT、WM_GETFOCUS这样与鼠标、焦点、键盘、刷新相关的消息产生)。

对于调试与消息相关的程序来说(比如像XDE这样拥有自己消息控制的程序),console这样的特性是非常重要的。

在windows系统下使用C/C++编程的时候,我们一般会有两种选择,一个是做成类似DOS字符界面样式的程序(这就是console程序),这种程序的入口函数是main(对于UNICODE则是wmain),另一种是做成win32窗口程序,这样的程序会产生标准的windows 窗口,它的入口函数是WinMain 。

一般来讲,一个win32的窗口程序在默认状态下是不会产生console窗口的。

但是,对于一个win32窗口程序,我们可以在运行期间给这个程序添加一个控制台窗口。

有几个win32的API是用来实现这个功能的:AllocConsole,FreeConsole以及与Console相关的Get和Set系列函数。

AllocConsole用来产生一个窗口,FreeConsole用来销毁它。

下面我们来具体地看看每一个函数的作用。

与Console窗口相关的API函数介绍:BOOL AllocConsole(void)这个函数为调用它的进程产生一个console窗口,如果成功,就返回非0值;否则,返回0。

要注意的是,每个进程最多只有拥有一个console的窗口(但多个进程可能同时拥有一个console窗口,比如子进程可以共享父进程的console窗口),如果这个进程已经有一个console窗口了,那么再调用AllocConsole的时候它会返回0。

BOOL FreeConsole(void)销毁进程所拥有的console窗口(如果这个console是被多个进程共同拥有,那么它不会被Free掉,但是调用此函数的进程将无法再访问到这个console了)。

成功返回非0值,否则返回0 。

HANDLE GetStdHandle(DWORD nStdHandle);nStdHandle:取STD_INPUT_HANDLE、STD_OUTPUT_HANDLE、STD_ERROR_HANDLE 三个值中的一个。

STD_INPUT_HANDLE:标准输入设备句柄STD_OUTPUT_HANDLE:标准输出设备句柄STD_ERROR_HANDLE:标准错误输出设备句柄。

这个函数用来获取标准输入、输出、错误输出设备的句柄。

这些句柄是某些console相关的函数上会用到,比如下面几个函数。

BOOL WriteConsole(HANDLE hConsoleOutput, // 控制台窗口输出句柄const VOID* lpBuffer, // 需要输出的字符所在的buffer addressDWORD nNumberOfCharsToWrite, // 需要输出的字符个数LPDWORD lpNumberOfCharsWritten, // 实际被输出的字符个数LPVOID lpReserved // 保留用,必须为NULL);这个函数用来向console窗口的输入缓冲区中写入字符串。

BOOL WriteConsoleInput(HANDLE hConsoleInput, // 控制台窗口输出句柄const INPUT_RECORD* lpBuffer, // 需要输出的字符所在的buffer addressDWORD nLength, // 需要输出的字符个数LPDWORD lpNumberOfEventsWritten // 实际被输出的字符个数);功能与上一个函数类似,只是它不写入缓冲区而是直接写到输出设备上。

BOOL ReadConsole(HANDLE hConsoleInput, // 控制台窗口输入句柄LPVOID lpBuffer, // 需要输入的字符存放的buffer addressDWORD nNumberOfCharsToRead, // 需要输入的字符个数LPDWORD lpNumberOfCharsRead, // 实际被输入的字符个数LPVOID lpReserved // 保留用,必须为NULL);这个函数用来从console窗口的输入字符。

BOOL ReadConsoleInput(HANDLE hConsoleInput, // 控制台窗口输入句柄PINPUT_RECORD lpBuffer, // 需要输入的字符存放的buffer addressDWORD nLength, // 需要输入的字符个数LPDWORD lpNumberOfEventsRead // 实际被输入的字符个数);功能与上一个函数类似,如果输入函数中包含除键盘之外的输入事件(如窗口的大小变化、鼠标事件)时,用ReadConsole 无法读入,只能使用ReadConsoleInput 读入。

虽然使用这几个API可以为win32产生一个控制台窗口,并在这个窗口中进行输入和输出。

但是仅仅这样做的话,便不能使用标准C函数库的输入输出系列的函数(如printf、scanf、gets等),而只能使用WriteConsole这类win32函数向这个窗口进行输出,使用ReadConsole这类win32函数来从控制台窗口得到输入。

但是这样会有一些问题:最重要的是WriteConsole、ReadConsole等几个函数没有printf系列的函数那样方便灵活,因为它们不能像printf系列函数那样对字符串进行格式化,而且WriteConsole、ReadConsole等几个函数的输入参数使用起来也不那么方便,比如要得到控制台窗口的句柄等等。

另外,对于构建在系统的上层的部分(如HMI)来说,使用标准C是一个很重要的选择――这样HMI层(包括它的调试代码部分)才能与平台无关。

所以我们需要将标准C的输入输出流与生成的控制台窗口绑定到一起去,或者说,把标准C的输入输出流重定向到用AllocConsole生成的控制台窗口中去。

标准C的输入输出在内部是使用stdin、stdout、stderr来进行的。

这三者实际上是三个FILE *类型的指针。

这三个指针所指向的三个FILE类型的数据存储着标准输入输出流的对象(即从何处输入,输出到何处)的信息。

通常情况下,stdin绑定在键盘设备上,stdout、stderr则绑定在标准输出屏幕。

当我们需要将标准C的输入输出进行重定向的时候,就需要将它们(可以看作是标准C的输入输出句柄)与Alloc出来的控制台窗口的句柄联系起来,使得在使用标准C的IO库函数时,这些函数在内部最终把输入输出动作转交给了Win32的API来做。

输入输出重定向需要用到VC运行时函数库提供的_open_osfhandle()函数(使用这个函数打开的文件要用_close来关闭),先来介绍一下这个函数:int _open_osfhandle (intptr_t osfhand le, // 操作系统的文件句柄int flags //);flags参数可以用下面几个值:●_O_APPEND:Positions a file pointer to the end of the file before every write operation.●_O_RDONL Y:Opens the file for reading only.●_O_TEXT :Opens the file in text (translated) mode.重定向的步骤用代码表示是这样的://将STDOUT 重定向到consolelStdHandle = (long)GetStdHandle(STD_OUTPUT_HANDLE);hConHandle = _open_osfhandle(lStdHandle, _O_TEXT);fp = _fdopen( hConHandle, "w" );*stdout = *fp;setvbuf( stdout, NULL, _IONBF, 0 );// 将STDIN重定向到consolelStdHandle = (long)GetStdHandle(STD_INPUT_HANDLE);hConHandle = _open_osfhandle(lStdHandle, _O_TEXT);fp = _fdopen( hConHandle, "r" );*stdin = *fp;setvbuf( stdin, NULL, _IONBF, 0 );//将STDERR重定向到consolelStdHandle = (long)GetStdHandle(STD_ERROR_HANDLE);hConHandle = _open_osfhandle(lStdHandle, _O_TEXT);fp = _fdopen( hConHandle, "w" );*stderr = *fp;setvbuf( stderr, NULL, _IONBF, 0 );这样标准C的输入输出就重定向到Alloc出来的Console窗口中了,可以使用printf等进行输入和输出操作。

后记:一般使用控制台进行调试的时候,控制台输入输出需要另外启动一个线程来进行操作,这样才不会影响到被调试的程序。

其它线程在使用控制台进行信息输入输出的时候,也要稍微地注意避免出现线程之间的race condition 。

附件中有一个例子程序(Win32Console.rar),以最简单的形式演示了上述的方法,程序运行后的界面如下图所示:说明:程序在CWin32ConsoleDlg::OnInitDialog中用RedirectIOToConsole函数生成一个控制台并将标准C的输入输出重定向到这个console窗口上。

然后再启动一个以ThreadProc 函数为招待代码的线程不断地处理输入,使console窗口中出符SIM>字样的提示符。

相关文档
最新文档