做過程式設計的朋友們當然記得我們學習程式設計的控制檯程式,永遠是那麼一個黑黑的視窗。我們在裡面儘量做著我們的標準輸出,但是我們是否想過控制檯也有不為我們所知的一些祕密。在我的上一篇博文中,我寫過控制檯程式其實和我們的介面程式設計是一樣的,這裡我想來像大家展示並且證明一下我的觀點!((*^__^*) 嘻嘻……)希望大家喜歡。

       在Windows下,我想大家都很清楚的知道我們建立了一個視窗,作業系統自然會給我們的視窗在系統核心中會有一個標識–(也就是我們通常說的HWND視窗控制程式碼)。首先,我們大家猜一下,我們的控制檯程式有沒有視窗呢!呵呵…,當然它是有的,不然我的黑框框是什麼呢!它就是一個名副其實的視窗。那我們的控制檯程式有沒有視窗控制程式碼呢?我想開始大家對於這個問題肯定有點猶豫,因為我們做了很長時間的程式設計都沒見過也沒人告訴我們,我們的控制檯的程式有一個控制程式碼(Hwnd)。上面說了,在作業系統內部對於每個視窗作業系統都會給予一個控制程式碼,當然對於我們的控制檯,作業系統也不會特殊對待,它同樣也有一個Hwnd。

       好了,大家都知道控制檯程式有視窗控制程式碼。但是他在那裡呢?我們怎樣得到它呢?各位朋友莫急,我這就告訴大家。下面是一個簡單的獲取控制檯視窗控制程式碼的例子。

&#160;#include <stdio.h>

&#160;#include <windows.h>

&#160;

&#160;&#160;typedef HWND (WINAPI *PROCGETCONSOLEWINDOW)();

&#160;&#160;PROCGETCONSOLEWINDOW GetConsoleWindow;

&#160;

Int main()

{

&#160;&#160;&#160;&#160;&#160;&#160; HMODULE hKernel32 = GetModuleHandle(“kernel32”);

&#160;&#160;&#160;&#160;&#160;&#160; GetConsoleWindow= (PROCGETCONSOLEWINDOW)GetProcAddress(hKernel32,”GetConsoleWindow”);

&#160;&#160;&#160;&#160;&#160;&#160; HWND cmd=GetConsoleWindow();

}

&#160;&#160; 首先,我們的需要的系統API在Kernel32裡面,然後我們匯出GetConsoleWindow函式我們就可以實現獲得視窗控制程式碼!那麼我們現在得到視窗控制程式碼,我們能幹什麼呢?在這裡我告訴大家一個很興奮的事,我們得到了視窗控制程式碼,在影像介面下能做的我們現在都可以做!如果你不信,你在視窗中畫個圓看看(你就知道我沒騙你了,不過記得要改變畫刷的顏色啊!)。

下面是我在控制檯中顯示一幅點陣圖的程式碼,大家也可以試試看,絕對是可行的!(要把點陣圖複製到你所建Project目錄下面,並且改名為1.bmp)

#include <stdio.h>

#include <windows.h>

&#160;

typedef HWND (WINAPI *PROCGETCONSOLEWINDOW)();

PROCGETCONSOLEWINDOW GetConsoleWindow;

&#160;

Int main()

{

&#160;&#160;&#160;&#160;&#160;&#160; HMODULE hKernel32 = GetModuleHandle(“kernel32”);

&#160;&#160;&#160;&#160;&#160;&#160; GetConsoleWindow= (PROCGETCONSOLEWINDOW)GetProcAddress(hKernel32,”GetConsoleWindow”);

&#160;&#160;&#160;&#160;&#160;&#160;&#160;HWND cmd=GetConsoleWindow();

&#160;&#160;&#160;&#160;&#160;&#160;&#160;HDC dc = GetDC(cmd);

&#160;&#160;&#160;&#160;&#160;&#160; HBITMAP hBitmap;

&#160;&#160;&#160;&#160;&#160;&#160; hBitmap=(HBITMAP)LoadImage&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; (NULL,”1.bmp”,IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);

&#160;&#160;&#160;&#160;&#160;&#160;&#160;HDC cmdmem = CreateCompatibleDC(dc);

&#160;&#160;&#160;&#160;&#160;&#160; SelectObject(cmdmem , hBitmap);

&#160;&#160;&#160;&#160;&#160;&#160; BitBlt(dc , 100 , 100 , 300 , 300 , cmdmem , 0 , 0 , SRCCOPY);

&#160;&#160;&#160;&#160;&#160;&#160; Return 1;

}

&#160;&#160;&#160;&#160;&#160; 現在大家覺得怎麼樣!大家同意我上一篇博文的觀點嗎!(呵呵…)我們現在可以完成對控制檯做你想做的一切!Do it Now!

&#160;&#160;&#160;&#160;&#160; 下面在介紹一些實用的控制檯函式,這裡我就不過多的介紹了,如果有興趣的朋友可以檢視MSDN或者Google!

GetSystenMenu———————————–取得控制檯的系統選單

EnableMenuItem———————————-對選單項的操作

ReadConsoleOutputCharacter——————-從控制檯緩衝區中讀出文字並儲存到變數中

GetStdHandle————————————–取得標準輸入,輸出,錯誤的控制程式碼

SetConsoleCursorPosition———————–設定控制檯游標的位置

ScrollConsoleScreenBuffer———————-設定控制檯回滾的Buffer大小

SetConsoleDisplayMode————————-設定控制檯顯示模式(是否全屏)

mouse_event—————————————模擬滑鼠操作

ReadConsoleInput——————————–命令列的控制輸出,獲取命令列的資訊

GetConsoleMode———————————可以讓控制檯支援滑鼠

FillConsoleOutputAttribute———————彩色控制檯設定輸出的顏色

SetConsoleTextAttribute————————設定文字顏色

&#160;

如果對於控制檯有不同理解的朋友,我希望可以在我的部落格中和我交流,讓我們都能有更深層次的理解。

部落格轉到:http://van.nxspace.cn