讓Win32視窗程式擁有控制台視窗

2021-08-04 16:44:14 字數 1424 閱讀 3210

讓win32視窗程式擁有控制台視窗

首先,為什麼我們有了普通視窗後還要控制台視窗呢?因為我們可以用它方便的輸出除錯資訊,而且普通玩家看到了也會覺得很高階。如果他會輸幾條命令,可能他會以為自己就是黑客了。

示例效果:

winmain作為入口函式後,手動建立了控制台視窗,然後建立了普通視窗,輸出了一些資訊到控制台視窗。

具體實現:

為什麼我不用main作為入口函式,再建立普通視窗呢?因為使用者不可以選擇關閉控制台視窗。如果強行實現就是先找到視窗控制代碼然後再呼叫showwindow隱藏掉視窗。但實際還是會閃一下,其實大家可以發現有一些比較low的病毒雙擊後就會閃一下。

要建立乙個控制台視窗,首先呼叫allocconsole建立乙個。但此時呼叫cout或者printf都不能正常輸出文字到視窗(包括輸入流cin和scanf)。所以需要如下重定向輸入輸出流:

allocconsole();

file* stream;

freopen_s(&stream, "con", "r", stdin);//重定向輸入流

freopen_s(&stream, "con", "w", stdout);//重定向輸入流

如果我們需要用到控制台視窗控制代碼,可以呼叫findwindow取得:

hwnd _consolehwnd;

setconsoletitle(default_console_title);//設定視窗名

for (int i = 0; i < 100; i++)

然後還需要輸出流控制代碼:

handle _handleoutput;

_handleoutput = getstdhandle(std_output_handle);

在不需要的時候請呼叫freeconsole釋放控制台視窗:

freeconsole();

完成以上工作後,就能夠建立乙個控制台視窗,並能夠使用cout標準輸出流輸出文字到其上。這裡我們用wcout為例,並給文字新增上顏色:

void debuggerconsole::write(const string& str, int level)

std::wcout << str.getwcs();//獲取字串wchar陣列版本

}其中setconsoletextattribute設定了輸出文字的顏色,第乙個引數是前面取得的輸出控制代碼,第二個引數是巨集的值組合。foreground字首代表前景色,background代表背景色。red、green、blue是三原色分量,intensity代表顏色加強(變得更亮)。

最後再提一句,wcout不能直接輸出中文,需要提前呼叫一句(至於為什麼我也不知道^_^):

locale::global((locale("")));

日期:17-07-31

win32視窗程式轉為控制台

windows支援兩種型別的程式,gui graphical user inte ce 和cui console user inte ce 他們是通過乙個叫載入器的東西進行載入,vs中只要修改聯結器 系統 子系統中的值,如果是gui則是 subsystem windows 如果是cui則是 subs...

Win32視窗程式使用控制台

win32視窗程式使用控制台對應的函式是allocconsole和freeconsole。向控制台輸出 allocconsole handle hd getstdhandle std output handle writeconsole hd hello console n sizeof hello...

WIN32控制台程式隱藏DOS視窗

如下 pragma comment linker,subsystem windows entry winmaincrtstartup pragma comment linker,subsystem windows entry maincrtstartup pragma comment linker,...