トップページ > 過去ログ > 記事閲覧
マウスによってウインドウからフォーカスが外れないようにしたい
名前:powder 日時: 2009/06/02 16:22

ウインドウモードでマウスを使用するゲームを作成しています。 間違ってゲームウインドウ外をクリックしたときにゲームウインドウ からフォーカスがはずれてしまうのが煩わしいので、マウスカーソルが ゲームウインドウ内のみ移動できるように(且つ、フォーカスも外れない ように)する方法はありますでしょうか。 ご教授よろしくお願いします。

Page: 1 |

Re: マウスによってウインドウからフォーカスが外れないよう ( No.1 )
名前:ねこ 日時:2009/06/02 17:13

こんな感じにしてはどうでしょう? // マウス座標を取得 int mx = 0, my = 0; GetMousePoint( &mx, &my ); // ( 0, 0, 640, 480 )の範囲に収める mx = mx < 0 ? 0 : mx; mx = mx > 640 ? 640 : mx; my = my < 0 ? 0 : my; my = my > 480 ? 480 : my; // マウス位置を設定 SetMousePoint( mx, my ); ※1 マウス座標を補正しているだけなのでウィンドウ端ではカーソルが震えるような挙動になります。 マウス表示を消して、マウス代わりの画像を表示すると見栄え良いかもしれません。 ※2 非アクティブでも処理する設定だと他画面でもウィンドウ内にしかマウスが動けなくなります。
Re: マウスによってウインドウからフォーカスが外れないようにしたい ( No.2 )
名前:Will 日時:2009/06/02 18:40

やり方としてはねこさんの提示されている方法でいいと思いますが、Y方向を0で制限すると ウィンドウの×ボタンも押せなくなります。 あと、個人的にはそういうことはしないほうがいいと思います。 あなた一人しか使用しないソフトであれば問題ないですが、他の人にもプレイしてもらいたいのであれば 他のソフトの動作にも支障をきたすような機能は盛り込むべきではないです。 というか、そこまでしたいのであればウィンドウである意味が全くないので、フルスクリーンで作ったほうがいいと思います。
Re: マウスによってウインドウからフォーカスが外れないよう ( No.3 )
名前:powder 日時:2009/06/02 21:33

>ねこさん ありがとうございます。 その処理を試してみましたが、やはり画面外に出たのを強制的に戻している のでクリックのタイミングによってはフォーカスが外れてしまいますね。 ううーん、マウス操作のMMOゲームみたいにするにはWindowsAPIで設定するしか ないのでしょうかねー。 >Willさん ご忠告ありがとうございます。 そこは考慮の上で上記の挙動が欲しいと考えております。 またフルスクリーンのみの対応は苦痛に思うプレイヤーも多いのでウインドウ フォーカス固定と同程度に慎重に決定するべき事柄と考えています。
Re: マウスによってウインドウからフォーカスが外れないようにしたい ( No.4 )
名前:Will 日時:2009/06/03 10:00

フォーカスについては試してないけど以下の方法で何とかなるかもしれません。 1.GetWindowActiveFlagで自アプリがアクティブかどうかをチェックする 2.非アクティブの場合、以下の方法でアクティブに戻す 2−1.GetMainWindowHandleでウィンドウハンドルを取得 2−2.SetActiveWindowかSetForegroundWindowでウィンドウをアクティブにする
Re: マウスによってウインドウからフォーカスが外れないようにしたい ( No.5 )
名前:Will 日時:2009/06/03 10:03

追加 上記の処理をSetActiveStateChangeCallBackFunctionで設定したコールバック関数内でするといいと思います。
Re: マウスによってウインドウからフォーカスが外れないよう ( No.6 )
名前:powder 日時:2009/06/03 15:12

ありがとうございます。 SetActiveStateChangeCallBackFunctionなんて関数があったんですね。 これでウインドウ外に出た瞬間をフックできるなら実現できそうですね。 ただ、自分が使っているのはC♯用のDLLでどうも該当関数が使えないみたい なので確認できず。残念です……
Re: マウスによってウインドウからフォーカスが外れないようにしたい ( No.7 )
名前:管理人 日時:2009/06/03 23:55

C#用ではポインタを使用する関数はことごとく使えなくなっています なので、専用の関数を追加しました、宜しければこちらをダウンロードしてください m(_ _)m http://homepage2.nifty.com/natupaji/DxLib/DxLibDotNet2_25c.zip 追加した関数は以下の関数です // マウスポインタがウインドウのクライアントエリアの外にいけるかどうかを設定する( TRUE:いける( デフォルト設定 ) FALSE:いけない ) int SetValidMousePointerWindowOutClientAreaMoveFlag( int Flag ) ; SetActiveStateChangeCallBackFunction もビックリの関数名の長さですが・・・ この関数に FALSE を渡して呼び出せば、以後メインウインドウのクライアントエリアの外に マウスポインタを移動できなくなります ただ、別のウインドウにフォーカスが移った場合は解除され、再度メインウインドウに フォーカスが移った場合も、一度でもクライアントエリアに踏み込まなければ自由に マウスポインタを移動できるようになっています 宜しければお使い下さい
Re: マウスによってウインドウからフォーカスが外れないよう ( No.8 )
名前:powder 日時:2009/06/04 00:13

>管理人さん まさかわざわざ機能追加版を作成して頂けるとは思ってなかった ので感激です。ありがとうございます、早速使わせて頂きます。
Re: マウスによってウインドウからフォーカスが外れないよう ( No.9 )
名前:powder 日時:2009/06/04 00:26

動作確認しました。まさしく自分が実現したい機能でした。管理人様どうもありがとうございました。

Page: 1 |