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

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2006/01/22 14:52:09
  • 終了:--

回答(2件)

id:lupu No.1

lupu回答回数214ベストアンサー獲得回数02006/01/22 16:16:20

ポイント20pt

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);

}

id:Kassan

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

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

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

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

2006/01/22 19:20:05
id:aki73ix No.2

aki73ix回答回数5224ベストアンサー獲得回数272006/01/23 16:11:02

ポイント200pt

基本的にフォームの外のアプリケーションのメッセージを取るためには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);

}

参考サイト

id:Kassan

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

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

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

2006/01/23 21:25:07

コメントはまだありません

この質問への反応(ブックマークコメント)

トラックバック

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません