iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 3
1
Software Development

若沒有遊戲引擎、合作夥伴...做得出遊戲嗎? 不試試看不知道吧? [使用C語言]系列 第 3

[11屆鐵人賽Day3] Windows API簡介—介紹主題會使用到的部分

  • 分享至 

  • xImage
  •  

在今天進入引言之前,先跟各位讀者說明這次主題會用到的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,

這四個參數的意思就好,由上到下分別是:

  • x: 視窗左上角離螢幕最左側距離
  • y: 視窗左上角離螢幕最頂端距離
  • cx: 視窗寬度
  • cy: 視窗高度

這次我會將這個函數設定為像這樣子:

SetWindowPos(GetConsoleWindow(), HWND_TOPMOST, 500, 100, 0, 0, SWP_NOSIZE);
  1. GetConsoleWindow()的意思就是取得現在這個視窗,這個是固定的不會變
  2. HWND_TOPMOST這個是一種Windows的定義,只要設定這個,視窗就會永遠在最頂層,我們這次就使用這個設定吧
  3. 500, 100 代表離螢幕最左側500,離螢幕頂端100,這部分我都是實際去測試大概是如何的距離,比較好抓
  4. 0, 0, SWP_NOSIZE 這邊需要三個參數一起看,SWP_NOSIZE代表保持現在的視窗大小,也就是前面兩個cx, cy不取用,因此我設為零

所以開一個新專案後,創立一個"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!"的字,每隔一秒最多只會偵測你按一次。


今天就到這邊吧,之後會用到的函數到時候會再一邊跟大家說明的~


上一篇
[11屆鐵人賽Day2] Windows Command-Line(cmd) 極簡介紹
下一篇
[11屆鐵人賽Day4] 3D投影—三維映射到二維
系列文
若沒有遊戲引擎、合作夥伴...做得出遊戲嗎? 不試試看不知道吧? [使用C語言]30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言