在今天進入引言之前,先跟各位讀者說明這次主題會用到的IDE(整合開發環境),也就是打程式跑程式要用的軟體,我使用的是Code::Blocks,這是他的官網:http://www.codeblocks.org/ ,我使用的是16.01版本的Code::Blocks,大家可以斟酌跟我裝一樣的,也可以使用習慣的IDE~
p.s: 安裝方法可以搜尋一下「Code Blocks 安裝」,應該就有許多前輩們的安裝方法建議哦!
引言
今天要來說說Windows API的部分~
而因為我們主題不是這個,所以我只會簡單介紹,並且僅說說幾個會使用到的函數囉!
廢話不多說,我們先來看Wiki大神怎麼說:
Windows作業系統應用程式介面(Windows API),有非正式的簡稱法為WinAPI,是微軟對於Windows作業系統中可用的核心應用程式編程介面的稱法。它被設計為各種語言的程式呼叫,也是套用軟體與Windows系統最直接的互動方式。
來源:https://zh.wikipedia.org/wiki/Windows_API
這段話我們只要理解成,Windows API是用來與Windows系統直接互動的,可以被用在各種程式語言中,作為一種呼叫Windows系統各種功能的工具。再更白話的講,就是它已經幫你寫好各種函數、定義,可以直接拿來操作Windows系統的視窗等功能,而其實這次我們也只會用到操控視窗的功能囉~
使用方式
在C語言中要使用Windows API,最直接的方式就是include一個標頭檔:
#include <windows.h>
這個標頭檔幾乎包含了大部分你常用的函數或定義,我們這次需要的也只需要include進這個標頭檔就好,就可以來操控視窗了!
設定視窗位置
BOOL SetWindowPos(
HWND hWnd,
HWND hWndInsertAfter,
int X,
int Y,
int cx,
int cy,
UINT uFlags
);
來源:https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-setwindowpos
這個函數名稱是SetWindowPos,基礎作用是把視窗定位到想要的位置。
我們會利用這個函數將黑視窗固定在螢幕上想要的位置,上面那串函數宣告,只要知道
int X,
int Y,
int cx,
int cy,
這四個參數的意思就好,由上到下分別是:
這次我會將這個函數設定為像這樣子:
SetWindowPos(GetConsoleWindow(), HWND_TOPMOST, 500, 100, 0, 0, SWP_NOSIZE);
所以開一個新專案後,創立一個"main.c"檔,然後打上:
#include <windows.h>
int main()
{
SetWindowPos(GetConsoleWindow(), HWND_TOPMOST, 500, 100, 0, 0, SWP_NOSIZE);
return 0;
}
存檔後執行,就可以看到你的黑色視窗在距離螢幕左側500的位置,距離頂端100的位置,而且將滑鼠游標點到視窗外的話,你會發現這個視窗永遠在最上層哦!
可以自行測試其他x, y值, 看看怎麼樣是最適合的視窗位置。
得到按鍵觸發訊息
SHORT GetAsyncKeyState(
int vKey
);
來源:https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getasynckeystate
這個函數名稱是GetAsyncKeyState,作用是取得某個鍵盤按鍵的狀態。
我們會利用這個函數來偵測鍵盤按鍵有沒有被按下,按下後再做想做的動作等等,其中:
int vKey
就是那個按鍵的代碼,可以填入例如空白鍵(VK_SPACE)、方向鍵上(VK_UP)等,而英文字母按鍵則用它的KeyCode來編號,例如A鍵就是65,S鍵就是83等,之後會使用到的按鍵會再提供給大家。
將剛剛的程式改成:
#include <windows.h>
int main()
{
for(;;)
{
if(GetAsyncKeyState(VK_SPACE) != 0) //如果空白鍵的狀態不是0(被按下)
{
printf("space key was clicked!\n"); //輸出「空白鍵被按下」的字
}
Sleep(1000); //休息1秒(不要太頻繁的偵測,以免按了一下變成好多下)
}
return 0;
}
存檔執行,黑視窗會等待你按下空白鍵,一旦你按了一下,就會看到視窗跑出了"space key was clicked!"的字,每隔一秒最多只會偵測你按一次。
今天就到這邊吧,之後會用到的函數到時候會再一邊跟大家說明的~