在Windows操作系統(tǒng)下用C語言控制輸出窗口大小首先需要調用GetStdHandle函數獲得窗口句柄,然后再調用相關函數修改窗口大小,如下所示:
站在用戶的角度思考問題,與客戶深入溝通,找到自貢網站設計與自貢網站推廣的解決方案,憑借多年的經驗,讓設計與互聯(lián)網技術結合,創(chuàng)造個性化、用戶體驗好的作品,建站類型包括:成都網站設計、做網站、成都外貿網站建設公司、企業(yè)官網、英文網站、手機端網站、網站推廣、國際域名空間、虛擬空間、企業(yè)郵箱。業(yè)務覆蓋自貢地區(qū)。
#include stdio.h
#include windows.h
#include conio.h
...
HANDLE hOut; /*標準輸出句柄*/
COORD size = {44, 7}; /*窗口大小*/
SMALL_RECT rc = {0, 0, 44-1, 7-1}; //要設置的窗口顯示的大小和位置
CONSOLE_CURSOR_INFO cursor = {1, FALSE}; /*光標信息,用于隱藏光標*/
hOut = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleWindowInfo(hOut, TRUE, rc);
SetConsoleScreenBufferSize(hOut, size);
SetConsoleCursorInfo(hOut, cursor);
CloseHandle(hOut);
...
函數GetStdHandle可以獲取當前標準輸入以及輸出設備的句柄。函數原型為:
HANDLE GetStdHandle(DWORD nStdHandle);
/*
其中,nStdHandle可以是
STD_INPUT_HANDLE 標準輸入設備句柄
STD_OUTPUT_HANDLE 標準輸出設備句柄
STD_ERROR_HANDLE 標準錯誤設備句柄
*/
需要說明的是,“句柄”是Windows最常用的一個概念。它通常用來標識Windows資源(如菜單、 圖標、窗口等)和設備等對象。雖然可以把句柄理解為是一個指針變量類型,但它不是對象所在的地址指針,而是作為Windows系統(tǒng)內部表的索引值來使用的。調用結束后,需要通過調用CloseHandle函數來關閉輸入輸出句柄。
你這個程序是捕捉0到9的按鍵狀態(tài),按下再松開時才會記錄,想要識別所有按鍵,把for循環(huán)范圍擴大。
比如for(charch=32;ch=127;ch++)這樣就包含了特殊符號及大小寫字母還有數字。
但是,這個代碼是有問題的!
一、你這個代碼需在鍵位已經按下后啟動才能識別,否則啟動時沒有按下對應鍵位,程序就結束了。要嵌套死循環(huán),讓其一直檢測。
二、直接擴大ASCII區(qū)間,像上面的那樣32~127,識別字母區(qū)間會被防毒軟件直接判斷為病毒??!。
三、GetAsyncKeyState不是C語言庫函數,是window的函數,換其它操作系統(tǒng)就失效。
GetAsyncKeyState返回值最高位為1則說明對應ch的鍵被按下,所以這里用0x8000來判斷最高位。
四、想要捕獲其它軟件界面內容還有很多方法,比如:
1、通過windowAPI函數FindWindow來獲取窗口句柄。
2、遍歷窗口下控件句柄,找到輸入框句柄。
3、通過窗口句柄找到進程id(GetWindowThreadProcessId函數),再通過id獲取進程句柄(OpenProcess函數)。
4、向目標進程申請內存(VirtualAllocEx),再通過PostMessage函數異步發(fā)送消息獲取目標控件內的內容(具體消息要結合控件類型,另外注意PostMessage是異步執(zhí)行)。
具體自行查閱資料,一言兩語說不清,上面步驟需先搞懂window消息機制。
注意:以上方法依然只限window系統(tǒng),且有數據保護的控件無法獲取。
五、或簡單暴力的方法,直接寫個定時截圖,只要硬盤夠不停桌面截圖。
但不論寫什么程序,和裝攝像頭一樣,終究都會被發(fā)現。?。。。。。。。。。。。?!
DWORD PID;
PID = GetProcessPID(L"test.exe");
//獲取進程pid函數
DWORD GetProcessPID(LPCTSTR pName)
{
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (INVALID_HANDLE_VALUE == hSnapshot) {
return NULL;
}
PROCESSENTRY32 pe = { sizeof(pe) };
BOOL fOk;
for (fOk = Process32First(hSnapshot, pe); fOk; fOk = Process32Next(hSnapshot, pe)){
if (!_tcsicmp(pe.szExeFile, pName)) {
CloseHandle(hSnapshot);
return pe.th32ProcessID;
}
}
return NULL;
}
//由進程pid獲取進程句柄,置頂
HWND hh = GetProcessTopWindows(PID);
HWND GetProcessTopWindows(DWORD dwPID){
count = 0;
EnumWindows((WNDENUMPROC)EnumWndProc, (LPARAM)dwPID);
if(count 0) {
//cout "窗口句柄是:" nhWnd[count -1] endl;//輸出句柄,可用spy++工具核對
return (nhWnd[count -1]);
}
return NULL;
}
別忘了添加對應頭文件。
c語言中的俄羅斯方塊游戲里的一段,HWND wnd = GetHWnd();獲取窗口的句柄