人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

C++Builderについて質問お願いします。フォームの外のデスクトップ上でOnMouseDown等のイベントを発生させるにはどうしたらいいのでしょうか?デスクトップ上に描画をする方法は分かったのですが,デスクトップ上でのクリック検出の方法が分かりません。素人ですいません。どうかよろしくお願いします。

●質問者: Kassan
●カテゴリ:コンピュータ
✍キーワード:C++Builder イベント クリック デスクトップ 素人
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● lupu
●20ポイント

http://www.hatena.ne.jp/1137909129

人力検索はてな - C++Builderについて質問お願いします。フォームの外のデスクトップ上でOnMouseDown等のイベントを発生させるにはどうしたらいいのでしょうか?デスクトップ上に描画をする..

WinAPIのSetCaptureは使えないでしょうか?

サンプル(一部分)を下に挙げておきます。


LRESULT CALLBACK WndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)

{

static BOOL flgCapture;


switch(Msg){

case WM_LBUTTONDOWN:

if(!flgCapture)

{

SetCapture(hWnd);

flgCapture = TRUE;

}

else

{

MessageBox(hWnd, TEXT(”WM_LBUTTONDOWN”), TEXT(”MOUSE”), MB_ICONINFORMATION);

ReleaseCapture();

flgCapture = FALSE;

}

return 0;

case WM_DESTROY:

PostQuitMessage(0);

return 0;

}


return DefWindowProc(hWnd, Msg, wParam, lParam);

}

◎質問者からの返答

どうもありがとうございます。

この方法は「フォーム内でクリックした後フォームの外までドラッグしてもイベント処理を行える」というように書いてあったのですが,全てフォーム外でもイベント処理は行えるのでしょうか?

すいません,僕はまだ知識が足らずよく分からなかったです。

フォーム外でのドラッグ中だけ線を描くようにしたいのですが,そう簡単ではないのでしょうか?


2 ● aki73ix
●200ポイント

http://nifberry.727.net/test/hatena166.lzh

基本的にフォームの外のアプリケーションのメッセージを取るためにはDLLにしないといけません


ただ、C++BuilderでDLLを使うと、Global変数が、スレッドごとに異なった値になってしまう仕様があるようなので、できれば、ここだけは、VCで作成する方が良いです


マウスの動作をフックするグローバルフックという処理をします


詳しくはSetWindowsHookExを調べてみるとよいでしょう


    hMHook= ::SetWindowsHookEx(WH_MOUSE, (HOOKPROC)MHook, hInst, NULL);


コールバックの中はこんな感じです

一応、デスクトップに落書きをするサンプルを添付しておきます(C++Builder6用です)

AppPrgが起動用、DllPrgがDLL用のプロジェクトです


LRESULT CALLBACK MHook(int nCode, WPARAM wp, LPARAM lp){

  PMOUSEHOOKSTRUCT p= (PMOUSEHOOKSTRUCT) lp;

  if (nCode == HC_ACTION){

#define WM_MOUSEWHEEL                   0x020A

if (wp==WM_LBUTTONDOWN){

//左ボタンを押したとき 色を変化させる

          r = rand() % 256;

          g = rand() % 256;

          b = rand() % 256;

//色変更

          PNST=0;

          MouseB|=1;

        }

        else if(wp==WM_MBUTTONDOWN){

//中央ボタンを押したとき

          MouseB|=4;

        }

        else if(wp==WM_RBUTTONDOWN){

//右ボタンを押したとき

          MouseB|=2;


        }

        else if (wp==WM_LBUTTONUP){

//左ボタンを離したとき

          MouseB&=~1;

          PNST=0;

        }

        else if(wp==WM_MBUTTONUP){

//中央ボタンを離したとき

      Beep(400,60);

          MouseB&=~4;

        }

        else if(wp==WM_RBUTTONUP){

//右ボタンを離したとき

          MouseB&=~2&~8;

        }

        else if(wp==WM_MOUSEWHEEL){

//ホィールしたとき

      Beep(900,60);

        }

        else if(wp==WM_MOUSEMOVE){

//マウスが動いた時

          if((MouseB&1)){

            if(PNST==1){

              HDC hDC;

              HPEN hPen,hPen2;

//ディスプレイに線を書く

              hDC=CreateDC(”DISPLAY”,0,0,0);

              hPen=CreatePen(PS_SOLID,1,RGB(r,g,b));

              hPen2=SelectObject(hDC,hPen);

              MoveToEx(hDC,MouseX,MouseY,0);

              LineTo(hDC,p->pt.x,p->pt.y);

              hPen2=SelectObject(hDC,hPen2);

              DeleteObject(hPen);

              DeleteDC(hDC);

            }

            else{

              PNST=1;

            }

          }

        }

//座標の更新

        MouseX=p->pt.x;

        MouseY=p->pt.y;

  }

//描画時は処理をしない

  if(PNST)return 1;

  else return CallNextHookEx(hMHook, nCode, wp, lp);

}

http://www.doumo.jp/aon-java/jsp/postgretips/tips.jsp?tips=79

http://www.kab-studio.biz/Programing/Codian/DLL_Hook_SClass/08.h...

システムフック

参考サイト

◎質問者からの返答

とても参考にも勉強にもなります!

ファイルまで戴いてもう本当に感謝してます。

どうもありがとうございました!

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ