讓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,...