WIN32

目次

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などのショートカットが再現できないことがある見たい・・・。未調査。

2006/10/03 komina

マウスカーソルを操作する

マウスからの操作があったかのようにWindowsに振舞わせます。マクロ再生などの用途に使えます。
mouse_event()関数を使います。
操作が速過ぎると上手く行かないことがあるのでウェイトを入れるのがコツです。

mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, NULL);
mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, NULL);

上のサンプルでは、マウスの左ボタンをクリックします。

2006/10/03 komina

指定座標の色を取得する

今見ている画面について、ある座標のドットのカラーコードを取得します。
GetDC()関数でデバイスコンテキストを取得し、GetPixel()関数でカラーコードを調べることが出来ます。最後にReleaseDC()にて取得したデバイスコンテキストを開放します。

HDC hdc = GetDC(0);
COLORREF c = GetPixel(hdc, x, y);
ReleaseDC(0, hdc);

上のサンプルでは、画面上(x,y)の点のカラーコードを取得します。
GetDC()の引数を任意のウィンドウハンドルにすれば、特定のウィンドウに対しての操作になります。

2006/10/03 komina

komina