經常看到一些程式在執行的時候有乙個windows控制台,感覺非常cool。實際上有的時候幫助你監視系統執行是很方便的,那麼怎麼樣建立乙個控制台呢?
實際上windows為你提供了一系列的api來完成這個功能,例如:readconsole,writeconsole等,具體參見msdn。
下面我們用一段**來說明如何建立console.
1。首先呼叫allocconsole函式來為你程序建立乙個console,該api是將當前程序attache到乙個新建立的console上。你還可以通過呼叫setconsoletitle(tstrname);來設定console的title.
2。使用writeconsoleoutput來將資訊輸出到console上;在輸出之前,先要得到console的handle,這通過getstdhandle(std_output_handle)來得到,然後將資訊組織成console的格式,然後輸出。
3。關閉console。當不需要這個console的時候,呼叫freeconsole來將當前程序從console中detach中。
下面是我寫的乙個實現以上功能的介面類:
//標頭檔案
#pragma once
#include
#include
class cconsoleoutinfo
;class cconsolemgr
virtual dword processconsoleinput(input_record* pinputrec,dword dwinputs) =0;
protected:
void setconsolebuffersize(**all_rect &writeregion,
coord &buffersize,
coord &buffercoord);
void resetthreadinfo();
private:
handle m_hconsolethread;
dword m_idconsolethread;
};//cpp檔案
#include "stdafx.h"
#include "./consolemgr.h"
#define max_shadow_console_input_buffer 50
dword winapi consoleinputmonitor(lpvoid lparam);
bool winapi myhandlerroutine(dword dwctrltype);
cconsolemgr::cconsolemgr(void)
void cconsolemgr::resetthreadinfo()
cconsolemgr::~cconsolemgr(void)
bool cconsolemgr::createconsole(tchar * tstrname,bool bfulldo**ode)
setthreadpriority(m_hconsolethread, thread_priority_normal);
resumethread(m_hconsolethread);
}return true;
}return false;
}void cconsolemgr::setconsolebuffersize( **all_rect &writeregion,
coord &buffersize,
coord &buffercoord)
bool cconsolemgr::outputtoconsole(cconsoleoutinfo &outinfo)
setconsolebuffersize(writeregion,buffersize,buffercoord);
// write texts to screen.
hconsoleoutput = getstdhandle(std_output_handle);
writeconsoleoutput(hconsoleoutput, buffer, buffersize,
buffercoord, &writeregion);
// set cursor information.
setconsolecursorinfo(hconsoleoutput, &consolecursorinfo);
// set cursor position.
setconsolecursorposition(hconsoleoutput, cursorposition);
return false;
}bool cconsolemgr::closeconsole()
closehandle(m_hconsolethread);
freeconsole();
resetthreadinfo();
return false;
}dword winapi consoleinputmonitor(lpvoid lparam)
return 0;
}bool winapi myhandlerroutine(dword dwctrltype)
如果你想為你的程式建立乙個console,那麼你只要從該類繼承即可,然後呼叫對應的方法。該類沒有對輸出進行格式化,所以使用起來有些不方便,過段時間處理一下。
建立控制台程式
var username,userpwd string login boolean begin try while not login do 登入 begin write login readln username setconsolemode getstdhandle std input hand...
為MFC工程新增乙個控制台
在mfc工程裡有時想要輸出一些資料,可以用trace之類的,也可以寫日誌,還可以為工程新增乙個控制台直接輸出到控制台裡,這樣可以很方便的查閱輸出的資訊。效果就是這樣的,在程式生成時建立乙個控制台,在程式關閉時會隨之銷毀,發布程式時只要把對應的 注釋掉就好了。具體的操作是在你想要建立控制台的類的建立方...
沒有控制台視窗的控制台程式
include include pragma comment linker,subsystem windows entry maincrtstartup int main int argc,char argv 編譯後執行程式會彈出乙個訊息框,而沒有背後的控制台視窗。再看看下面的 include in...