在Win32程序中显示Dos调试窗口,可暂停(AllocConsole,WriteConsole,FreeConsole函数,GetStdHandle函数取得输入句柄)

在很多程序中,都可以看到程序运行中,会有一个Dos窗口,实时显示一些运行信息,这里就告诉大家是如何实现的,我们做个简单的,其实对控制台的操作还有很多,有兴趣的可以去查资料。

用到的API函数如下:

//创建控制台
AllocConsole;

//获取控制台窗口
GetStdHandle;

//向控制台输出信息
WriteConsole;

//释放控制台
FreeConsole;

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
    //控制台句柄
    h_Console:THandle;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  p:PChar;
  num:Cardinal;
begin
  //获取控制台窗口
  h_Console := GetStdHandle(STD_OUTPUT_HANDLE);
  p := PChar(Edit1.Text);
  //向控制台输出信息
  WriteConsole(h_Console,p,Length(Edit1.Text),num,nil);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  //创建控制台
  AllocConsole;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  if h_Console = 0 then Exit;
  //释放控制台
  FreeConsole;
end;

end.

参考:http://www.cnblogs.com/key-ok/p/3429861.html

------------------------------------------------------------------------------------

function PauseConsole(Prompt: PAnsiChar): boolean;
var
  hStdIn, hStdOut: THandle;
  dwRd, dwWr, i: Cardinal;
  cBuf: array [0..128] of TInputRecord;
begin
  result := false;
  hStdIn := GetStdHandle(STD_INPUT_HANDLE);
  hStdOut := GetStdHandle(STD_OUTPUT_HANDLE);
  if ((hStdIn <> 0) and (hStdOut <> 0)) then
  begin
     WriteFile(hStdOut,Prompt[0],lstrlenA(Prompt),dwWr,nil);
     while ReadConsoleInput(hStdIn,cBuf[0],128,dwRd) do
     begin
       for i := 0 to dwRd do
       begin
         if ((cBuf[i].EventType = KEY_EVENT) and (cBuf[i].Event.KeyEvent.bKeyDown)) then
         begin
           Result := true;
           exit;
         end;
       end;
     end;
  end;
end;

  try
    PauseConsole(‘Press a key to continue...‘);
  except
    on E:Exception do
      Writeln(E.Classname, ‘: ‘, E.Message);
  end;

参考:http://www.cnblogs.com/key-ok/p/3380446.html

时间: 2024-10-10 05:42:04

在Win32程序中显示Dos调试窗口,可暂停(AllocConsole,WriteConsole,FreeConsole函数,GetStdHandle函数取得输入句柄)的相关文章

使用AllocConsole在Win32程序中调用控制台调试输出

近期一个Win32窗口项目中,调试时经常需要输出调试信息以追踪数据流及程序运行状态. 起初我封装了一系列文件操作,实现了日志形式的调试信息输出,但在后期的使用过程中越发觉得颇不顺手.那么,如何方便地在Win32程序中使用控制台进行调试输出?答案如题:AllocConsole函数和C-Runtime的freopen函数.具体操作流程如下: 打开控制台 重定向输出流至控制台 执行调试信息输出操作 完整代码如下: SetConsoleTitle(_T("Debug Output")); fr

自动化的在程序中显示SVN版本

有时候会有这样的情况,策划拿着应用过来提一个bug,但我们却不好确定策划的手机上装的应用对应的是那个代码版本. 为了解决这个问题,我们希望能在应用上显示出当前应用所对应的代码版本,即svn版本. 构想了下,希望最后达到的效果有: 自动化,不需要每次编译版本的时候有人为的步骤,比如编版本的时候人为修改某个值或者点击某个脚本. 跨平台,对外发布的win32/iOS/Android版本都能正确表现 全面性,无论用Windows上用vs开发/Mac OS上用XCode/Eclipse来进行开发,无论是D

vs2010 win32程序中 sqlserver 2008 express的简单使用 (C++)

由于短学期作业需要在之前程序的服务器中加入数据库,就简单学习了下vs2010中自带的数据库sqlsever2008,学习的过程并不是很顺利,在网上没有找到特别完整的教程,现在课程结束了,特地来写一个,以方便后面的孩纸们,由于本人也是学的半懂不懂的,如果有什么不对的地方还请大家指正! 一.从零开始,建立一个数据库 (1)打开VS2010,工具->连接到数据库,然后在弹出的对话中框选择“Microsoft SQL Server”,单击“继续” (2)在下图所示对话框“服务器名”中输入“自己的计算机名

运行批处理文件怎么不显示DOS命令窗口

运行批处理文件怎么不显示DOS命令窗口 BAT没法不显示DOS窗口.你可以考虑用脚本保持以下到文本文件,重命名为AutoUp_ddyy.vbs set WshShell = WScript.CreateObject("WScript.Shell")WshShell.Run "AutoUp_ddyy.exe -f",1 保存成vbs文件,就可以 URLRun(PChar(GetAppPath()+'AutoUp_ddyy.vbs')); 调用了 原文地址:https:

带dos调试窗口的win32程序

#pragma comment( linker, "/subsystem:\"console\" /entry:\"WinMainCRTStartup\"") 方法只要在cpp文件头部加入一行: #pragma comment( linker, "/subsystem:\"console\" /entry:\"WinMainCRTStartup\"")//以console程序样式,并且制

自己主动化的在程序中显示SVN版本号

有时候会有这种情况,策划拿着应用过来提一个bug,但我们却不好确定策划的手机上装的应用相应的是那个代码版本号. 为了解决问题.我们希望能在应用上显示出当前应用所相应的代码版本号,即svn版本号. 构想了下,希望最后达到的效果有: 自己主动化,不须要每次编译版本号的时候有人为的步骤,比方编版本号的时候人为改动某个值或者点击某个脚本. 跨平台.对外公布的win32/iOS/Android版本号都能正确表现 全面性.不管用Windows上用vs开发/Mac OS上用XCode/Eclipse来进行开发

在c++程序中执行DOS命令

转自博客:http://blog.csdn.net/ypist/article/details/8485049 #1,system()方式 在C盘根目录下新建文件夹,名称为12: system("md c://12"); 执行时命令窗口会闪一下,看不到执行结果: dos 自身提供了执行多条命令的功能,符号 && 代表同时执行多条命令. 如先切换到C下的12文件夹,然后执行dir命令:cd C:/12 && dir 暂停三秒后继续程序:ping -w 30

java程序中调用dos shell命令 -- 此处以调用doc命令为例

/**  *  Java调用windows的DOS命令  */ public class RunDocInJava{     public static void main(String[] args) {         InputStream ins = null;         String[] cmd = new String[] { "cmd.exe", "/c", "ipconfig" };  // 命令行         try 

matlab循环中显示figure时窗口跳动

在Matlab中,当在一个循环内部利用figure显示图片时,有时候会出现窗口跳动,尤其是两个显示器的时候, 具体就是每次循环中显示的figure的位置都出现在屏幕的不同位置,导致看起来灰常不爽 google了个解决方法: 利用imshow中的parent参数,将axis设置为与上一状态一致. code: figure(1);imshow(img,[],'parent',gca);