将棋放送用アプリケーションの進捗

どうもTOKKOです。

アプリケーションを作成していて困ったことと便利なことをまとめておきます。

マウスクリック時の座標検出をどうするかといった問題
マウスクリックのイベントを検出する際にはウインドウのハンドルが必須?なのでしょうか…実際クリックの検出を行った後に、GetCursorPosメソッドによって座標取得を行おうと考えていたのです。
しかし、将棋道場のウインドウはハンドルが別のため、ウインドウプロシージャによるイベント処理ができないことに気が付き断念…そこで透過ウインドウをフルスクリーンで表示して仮想的なウインドウを作成してクリック検出&座標取得を行うことに決定しました。

CreateWindowExメソッドにおいて
第1引数にWS_EX_LAYEREDを指定
第7,8引数に以下のように取得したディスプレイサイズを渡すことで全画面ウインドウを透過して表示させることが可能になります。
//ディスプレイサイズを取得
int dispx = GetSystemMetrics( SM_CXVIRTUALSCREEN);
int dispy = GetSystemMetrics( SM_CYVIRTUALSCREEN);

で、以下のようにウインドウプロシージャにクリック検出を行わせ、条件判断で透過ウインドウを削除します。
//ウインドウプロシージャ
LRESULT CALLBACK WindowProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam){

switch(Msg){
case WM_LBUTTONDOWN:
point.x = LOWORD(lParam);
point.y = HIWORD(lParam);
DestroyWindow(hWnd);
break;
}
//デフォルトの処理
return DefWindowProc(hWnd,Msg,wParam,lParam);
}

こんな感じでクリックした座標を取得して、道場ウインドウのハンドルを取得していきます~


"将棋放送用アプリケーションの進捗"へのコメントを書く

お名前:
メールアドレス:
ホームページアドレス:
コメント: