目次
windows.hのインクルード
コンソールアプリにしてもAPI等使う場合はwindows.hをインクルードする必要があります。その前に
#define STRICT
としておくと、型チェックが厳密になります。
232C使いたい
ファイルとしてオープンし、ハンドルを使って操作します。
下記の関数あたりを使えば大体のことは出来るじゃないかと思われます。詳細は気が向いたら書きます。というか私も確立してないし。
- CreateFile
- CloseHandle
- ReadFile
- WriteFile
- ClearCommError
- GetCommState
232Cの送受信はメインスレッドに置かずに、専用の別スレッド立てるのが良さげ。
マルチスレッド
マルチスレッド用にクラスが用意してある便利な時代なので、それ使った方が楽でしょう。ここではBC++5.0でクラスを使わずにスレッドを使う方法を書いておきます。
#include <process.h> void thread_func(void *p) { … _endthread(); // スレッド終了 } int main(void) { … int ID = _beginthread(thread_func, 4096, (void *)p)); // thread_func ... 指定の関数を別スレッドとして動かします。 // 4096 ... 作成するスレッドに与えるスタックサイズ // p ... スレッドに与える唯一の引数。 // 幾つかのデータを渡す必要がある場合は構造体のポインタなどを渡せば良いかと思います。 }
別の関数がバックグランドで動作するわけですが、メインの関数と完全に同期しないので注意が必要です。
割込プログラムならば、自分以上の優先度の割込を意識すれば良いだけですが、マルチスレッドでは自分以外のスレッドの動作に注意を払う必要があります。
特に同じデータを共有する場合には注意が必要です。
キーボードを操作する
キーボードから入力があったかのようにWindowsに振舞わせます。マクロ再生などの用途に使えます。
keybd_event()関数を使います。
操作が速過ぎると上手く行かないことがあるのでウェイトを入れるのがコツです。
keybd_event(VK_LMENU, 0, 0, 0); // ALT押下 keybd_event('w', 0, 0, 0); // 'w'押下 keybd_event('w', 0, KEYEVENTF_KEYUP, 0); // 'w'離す keybd_event(VK_LMENU, 0, KEYEVENTF_KEYUP, 0); // ALT離す
このサンプルでは、「ALT+W」というショートカットを再現します。
実際のキーボードと同じように、押した・離した、という状態を与える必要があります。
主な仮想キーコードの表を示します。
定数 | 意味 | 定数 | 意味 | |
---|---|---|---|---|
VK_LBUTTON | マウス左ボタン | '0'〜'1' | 非テンキーの数字 | |
VK_RBUTTON | マウス右ボタン | 'a'〜'z' | アルファベット | |
VK_MBUTTON | マウス中央ボタン | VK_NUMPAD0〜9 | テンキーの数字 | |
VK_UP | ↑ | VK_MULTIPLY | テンキー[*] | |
VK_DOWN | ↓ | VK_ADD | テンキー[+] | |
VK_RIGHT | → | VK_SEPARATOR | テンキー[,](カンマ) | |
VK_LEFT | ← | VK_SUBSTRACT | テンキー[-] | |
VK_F1〜24 | ファンクションキー | VK_DECIMAL | テンキー[.](ドット) | |
VK_RMENU | 右ALT | VK_DEVIDE | テンキー[/] | |
VK_LMENU | 左ALT | VK_NUMLOCK | [NumLock] | |
VK_CANCEL | [CTRL]+[PAUSE] | VK_BACK | [BackSpace] | |
VK_TAB | [TAB] | VK_CLEAR | [Clear] | |
VK_RETURN | [Enter](RETURN) | VK_SHIFT | [SHIFT] | |
VK_CONTROL | [CTRL] | VK_PAUSE | [PAUSE] | |
VK_KANJI | [漢字]([ALT]+[半角/全角]) | VK_CAPITAL | [CapsLock] | |
VK_ESCAPE | [ESC] | VK_CONVERT | [変換] | |
VK_SPACE | スペースキー | VK_NONCONVERT | [無変換] | |
VK_PRIOR | [PageUp] | VK_END | [END] | |
VK_NEXT | [PageDown] | VK_HOME | [Home] | |
VK_Execute | [Execute] | VK_SNAPSHOT | [PrintScreen] | |
VK_INSERT | [INSERT] | VK_DELETE | [DELETE] | |
VK_HELP | [HELP] | VK_LWIN | 左Windowsキー | |
VK_APPS | アプリケーションキー | VK_RWIN | 右Windowsキー |
CTRL+Wなどのショートカットが再現できないことがある見たい・・・。未調査。
マウスカーソルを操作する
マウスからの操作があったかのようにWindowsに振舞わせます。マクロ再生などの用途に使えます。
mouse_event()関数を使います。
操作が速過ぎると上手く行かないことがあるのでウェイトを入れるのがコツです。
mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, NULL); mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, NULL);
上のサンプルでは、マウスの左ボタンをクリックします。
指定座標の色を取得する
今見ている画面について、ある座標のドットのカラーコードを取得します。
GetDC()関数でデバイスコンテキストを取得し、GetPixel()関数でカラーコードを調べることが出来ます。最後にReleaseDC()にて取得したデバイスコンテキストを開放します。
HDC hdc = GetDC(0); COLORREF c = GetPixel(hdc, x, y); ReleaseDC(0, hdc);
上のサンプルでは、画面上(x,y)の点のカラーコードを取得します。
GetDC()の引数を任意のウィンドウハンドルにすれば、特定のウィンドウに対しての操作になります。