• ベストアンサー

カーソルが自分のウィンドウから出たことを知りたい

カーソルが自分のウィンドウから出たことを知る手段が わかりません。 C言語で開発していて、メッセージを GetMessage で 受け取っています。 カーソルが自分のウィンドウに入ってきたときは WM_SETCURSOR を受け取るため検知できるのですが、 カーソルが外れたときの検知ができません。 検知する方法などをご存知の方、アドバイスなどご教授 願います。 OSはWindowsXPです。

質問者が選んだベストアンサー

  • ベストアンサー
  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.1

SetCaptureでキャプチャを設定している間はマウスメッセージをすべて受け取ることが出来ます。 自ウィンドウから外れたらReleaseCaptureを忘れずに呼び出すと。 もしくは、 1.タイマーで監視 または 2.SetWindowsHookExでマウスフック(WH_MOUSE) で、マウスの移動を監視して、WindowFromPointで判断でしょうかね?

nabezo-
質問者

お礼

回答ありがとうございました。 参考にさせていただき、試してみます。 お礼が遅くなり申し訳ありませんでした。

その他の回答 (1)

  • 2ch
  • ベストアンサー率51% (64/125)
回答No.2

WM_KILLFOCUSが取れない?

nabezo-
質問者

お礼

回答ありがとうございました。 参考にさせていただき、試してみます。 お礼が遅くなり申し訳ありませんでした。

関連するQ&A

  • ウィンドウ起動時のカーソル位置について

    お世話になります。 OS:Windows Vista 言語:Visual C++ 2005 で開発しています。 TabControlを配置し、その中にTextBoxを配置した ウィンドウを開きます。 その時、最初に位置付くカーソルが Tabではなく、TabControl内のTextBoxにすることは可能でしょうか? TabIndexの順番をTextBox=0 TabControl=1にしてウィンドウを 起動しても最初のカーソル位置はTabControlに 位置付けられてしまいます。 以上、よろしくお願い致します。

  • ウィンドウメッセージについて

    Visual C++ で初歩のプログラミングをさせていただいてますが、 実現できない点があるのでご回答いただけると幸いです。 環境は以下になります。 SDK: Visual C++ 6.0 OS: Windows XP 今やっているのは、他のウィンドウの動きを監視するというものです。 対象のウィンドウがリサイズされたら、サイズがいくつに変更されたかメッセージボックスを出します。 以下の手順でプログラミングしました。 MSG msg; RECT r; HWND hWnd = FindWindow("Notepad", "無題 - メモ帳"); if(hWnd != NULL) { return 0; } while( GetMessage(&msg, hWnd, 0, 0) ) { if(msg.message == WM_SIZE) { GetClientRect(hWnd, &r) ... } } このように書くと、コンパイルも通ったのですが、 リサイズどころかウィンドウを動かすこともできなくなってしまいました。 こういうのって力技でしょうか・・・。 フリーソフトなどでも多いですが、ウィンドウを監視するプログラム のコアな部分はどのように書かれているものなのでしょう? よい例があればご教授よろしくお願いします。

  • ほかのアプリケーションからのメッセージの取得

    他のアプリケーションからのメッセージの取得方法を教えて下さい。 現在マインスイーパを起動し、そのボタンが押下される順番を記憶するプログラミングを制作しています。 マウスの左クリックに関するメッセージを取得すれば良いと思い、 GetMessage(&msg, hWnd, WM_LBUTTONDOWN, WM_LBUTTONUP);←hWndはマインスイーパのウィンドウハンドル のように書いたんですが、うまくいきませんでした。 調べてみるとGetMessageの第二引数は呼び出し側のスレッドに所属していなくてはならないということで、 この辺が原因なのだろうと思うのですが…。 どなたかご教授ねがいます。 <環境>  Windows Vista Home Premium  Visual C++ Express Edition

  • VC++でカーソルを固定する

    VC++のver6.0を使用している者です. 今回「カーソルがウィンドウの中心に固定されていて,左ボタンをクリックすると自由に動かすことができ,もう一度クリックするとカーソルは初期位置に戻り,再び固定されて動かすことが出来ない」というアプリを作成しようと思っています. コンセプトとして, ・ウィンドウズメッセージハンドラのWM_LBUTTONDOWNを用いる ・BOOL型の変数を用意し,左ボタンが押される度に真偽を入れ替える ・TRUEの状態ならば自由にカーソルを動かせる ・FALSEの状態だとウィンドウの中心に固定される(マウスを動かしてもカーソルは動かない) という感じにしたいと考えています. しかし,カーソルを固定,およびその解除の方法が分かりません.どのようにやればよいのでしょうか…よい方法がありましたら,ご教授ください. よろしくお願いします.

  • ドラッグしたときにマウスカーソルを変更するには?

    こんにちは。 VC6.0 MFCで開発しています。 マウスカーソルの形状をウィンドウをドラッグしているときとしていないときで 違ったものに変更したいのですが、うまくいきません。 ソースはこんなふうにしています。 ↓ void CTest::OnLButtonDown(UINT nFlags, CPoint point) { //変更する SetCursor(AfxGetApp()->LoadCursor( IDC_CUR2 )); CDialog::OnLButtonDown(nFlags, point); } void CTest::OnLButtonUp(UINT nFlags, CPoint point) { //元に戻す SetCursor(AfxGetApp()->LoadCursor( IDC_CUR1 )); CDialog::OnLButtonUp(nFlags, point); } どうぞ宜しくお願いします。

  • メッセージループについて

    while(true) { if(PeekMessage(&msg,NULL,0,0,PM_REMOVE)) { if(msg.message==WM_QUIT) break; DispatchMessage(&msg); if(!GetMessage(&msg,NULL,0,0)) { } } else { } これはpeekMessageがメッセージを取り出してメッセージがあったら if(msg.message==WM_QUIT) break; DispatchMessage(&msg); if(!GetMessage(&msg,NULL,0,0)) を実行して、GetMessage()で待機してもし、メッセージがWM_QUITならGetMessageにWM_QUITのメッセージを渡してメッセージが消えてPeekMessageはメッセージキューがないため、0を返し永遠にelseを繰り返すという認識でよろしいのですか? あと、while(true) { if(PeekMessage(&msg,NULL,0,0,PM_REMOVE)) { if(!GetMessage(&msg,NULL,0,0)) { } if(msg.message==WM_QUIT) break; DispatchMessage(&msg); } else { } if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))がWM_QUITのメッセージで そしてメッセージが消えてGetMessageで待機状態になるということでよろしいのでしょうか?ご教授お願いします。

  • Windowsプログラムでのメッセージループ

    Microsoft Visual C++6.0でWin32ApplicationでWindowsプログラムを作る勉強を始めました。 『Visual C++ 1 はじめてのWindowsプログラミング』(山本信雄 著) という本で勉強しています。 WinMain函數の中に次のような「メッセージループ」というものがあるんですね。 while(GetMessage(&msg,NULL,0,0)) { TranslateMessage(&msg); DispatchMessage(&msg); } 本の説明では 「メッセージループとは、GetMessageでメッセージの有無を常に確認しつづけるループです。Windowsプログラムは、何もしていないように見えるときでも常にメッセージループをじっこうしているのです。」 ということです。 また 「もしもメッセージがなければ、GetMessageは他のアプリケーションに処理を讓ります。これによってWindowsのマルチタスクがじつげんされています。」 ともありました。 私が思ったのは、 他のアプリケーションに処理を讓ってしまったら、上の説明にあるような「常にメッセージループをじっこうしている」ことにはならないんではないか、 ということです。 逆に、メッセージがあり續けたら、他のアプリケーションに処理を讓らないのでしょうか。 WindowsのマルチタスクはGetMessageが行っているのではなくて、WindowsというOSが行っているのではないでしょうか。 GetMessageが他のアプリケーションに処理を讓っている間の状態というのは、GetMessage函數がじっこうされている状態なのでしょうか。それとも、その間プログラムは停止しているのでしょうか。停止しているのだとしたら、再開するのはGetMessageの次のTranslateMessageからでしょうか。 編集部に質問を送ったのですが、返事はありません。 初級者ゆえ何か勘違いしているのかもしれません。 よろしくお願いいたします。

  • 別のアプリから表示されたダイアログを検知する方法

    似たような質問をこないだ行ったばかりになるのですが、別のアプリから行ったダイアログの表示を検知する方法について質問いたします。 調べたところWindowsからダイアログの表示時にWM_INITDIALOG当たりが投げられるようなのですが、これを取得する方法がわかりません。 環境: WindowsXP+BCB [ コード ] BEGIN_MESSAGE_MAP     VCL_MESSAGE_HANDLER( WM_INITDIALOG, hogehoge(ここに何を入れればいいのかがわかりません), GetDialog ) END_MESSAGE_MAP( TForm ) ご教授のほどを宜しくお願いいたします。

  • windowsプログラミング

    "猫でもわかるwindowsプログラミング"を読みながらWin32 APIを勉強しているのですが、なかなかうまくいかないところがあります。 モードレスダイアログボックスを表示してコントロールも問題なく行えているのですが、ダイアログボックスのウィンドウについている赤い閉じるボタンが反応を返しません。 自分で作った閉じるボタンでは正常に閉じるのですが、ウィンドウの閉じるボタンを押しても閉じません… ダイアログボックスのボタン類のIDと同様にウィンドウについている閉じるボタンにもIDは存在するのかと思ったのですが、resource.hを見ても書かれていないのでなさそうですね… メインウィンドウであればWM_CLOSEメッセージが送られてきますが、この場合も何かしらのメッセージが送られてきているのでしょうか? Windows7 , Visual Studio 2010 , C言語で書いています。

  • Windows Mbile について。まだ所有すらしてない初心者なので

    Windows Mbile について。まだ所有すらしてない初心者なのですが、たとえば海外などでWCDMAのスマートフォンのWindows Mbile版を買ったとします。 OSは中国語だったり、英語だったりしますよね。 このOSを日本語版WMにインストールしなおすのは可能なのでしょうか? どのようにやるのでしょうか。 もしくは、入力IMだけを日本語に設定するほうが楽なのでしょうか? 日本語のソフトは文字化けしますか? WMにはWindowsXPのように各国言語のIMが入っていますか? 色々確認してから買おうかと思っているので、お教えください。

専門家に質問してみよう