- ベストアンサー
ウインドウ位置の自動移動の解除
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
★過去に『WM_NCLBUTTONUPについて』という質問に回答しました。 ・でも、この方法は今回使えないかもしれませんね。多分? http://oshiete1.goo.ne.jp/qa2710782.html→『WM_NCLBUTTONUPについて』 試していませんので、上記の質問を参照してテストしてみませんか? ・以上。結果報告待ってます。
その他の回答 (2)
- Oh-Orange
- ベストアンサー率63% (854/1345)
★申し訳ありません。 ・前回の回答は、勘違いしていました。 私も自動的に戻ってしまう動作を阻止する方法が分かりません。 『DefWindowProc』が何かの動作を行っているようですが…。推測ですが 『WM_MOVING』中でマウスの左クリックが離されてから『WM_EXITSIZEMOVE』 メッセージが発生する間で、戻る動作を行っているかもしれません。→内部で。 ・私にも今のところ詳しく分かりません。ごめんなさい。 他の回答者さんを待ってみて下さい。 アイディア: ・『DefWindowProc』の『WM_NCLBUTTONDOWN』メッセージと同等な処理を 自分で実装して、『DefWindowProc』の『WM_NCLBUTTONDOWN』メッセージを 殺せば自動的には戻らないと思いますが…。試していませんのでヒントです。 ・なお、自分で同等機能の実現方法としては、クライアント領域をクリック中に マウスの移動に変化があったらば、ウインドウも一緒に移動するようにします。 ・このとき、タイマー処理で約 200 msくらいの間隔でマウス座標をチェックして 200 ms前の位置とずれていたらば、ずれた分だけウインドウも移動するように すればよいと思います。 ・以上。おわり。→『WM_NCLBUTTONDOWN』もタイマー処理などを使っていそうです。
お礼
いえ、丁寧な回答ありがとうございます。 当方も、位置情報を保存する方法で試行錯誤しているのですが、 どのメッセージの合間がいいのか?、自動位置変更の判別条件等が かなりシビアで困っているところです。 タイマーは最後の手段で・・・ WM_NCLBUTTONUPにクライアントのクリックでも メッセージが飛んで来れば良いのですが・・・
- Oh-Orange
- ベストアンサー率63% (854/1345)
★クライアント領域のウインドウ移動は『WM_NCLBUTTONDOWN』で行えます。 ・ウインドウの移動は自分で処理するよりも『SendMessage』関数などで 『WM_NCLBUTTONDOWN』メッセージを使えば楽です。 あと『WM_SYSCOMMAND』メッセージでも行えます。 下にそのサンプルを2つ載せます。→どちらでも移動可能。 サンプル: SendMessage( hWnd, WM_NCLBUTTONDOWN, HTCAPTION, 0 ); PostMessage( hWnd, WM_SYSCOMMAND, (SC_MOVE|0x02), 0 ); ※『hWnd』が移動するウインドウのハンドルです。 移動停止: ・デスクトップ以外にウインドウが移動したときに『移動停止』する方法は分かりませんが、 デスクトップ以外にウインドウが移動しないような制御は出来ます。この制御が出来れば マウスのクリックを離した後でもデスクトップ領域の中にウインドウが残ります。 ・この処理を行うには、移動中にデスクトップ領域の外に出ないようにメッセージを処理する 必要があります。移動中の処理で有名なのは『WM_MOVE』ですが、『WM_MOVING』という メッセージがあります。このメッセージの中で移動中のウインドウの矩形領域がデスクトップの 外へ移動したかチェックします。外へ出た場合は『デスクトップ内』にウインドウ位置を 戻すようにします。 最後に: ・移動制御する前に『WM_ENTERSIZEMOVE』メッセージ内でマウスが移動できる範囲を『ClipCursor』 関数で設定します。設定する矩形は『GetDesktopWindow』関数で取得したウインドウに対して 『GetWindowRect』関数で取得します。あと『WM_EXITSIZEMOVE』メッセージを捕まえて設定した マウス移動の領域を解除します。→解除の方法は『ClipCursor(NULL);』にするだけです。 『WM_MOVING』メッセージは、『lParam』に移動中のウインドウ矩形が入っています。→『LPRECT』型 このパラメータを使ってデスクトップ画面の外へ出た場合は、デスクトップ画面内に収まるように 再設定(上書き)します。これで、ウインドウの移動中にデスクトップ画面の外へ出ないように制御 出来ます。 ・以上。おわり。→下の『参考URL』もどうぞ。
関連するQ&A
- ウィンドウの移動ができない。
サイズ変更したウィンドウが移動できません。 マウスでタイトルバーをドラッグしようとすると、カーソルが上下の矢印になってタイトルバーをつかむことができません。 タイトルバー上で右クリック、「移動」を選択して移動はできます。 回答よろしくお願いします。
- 締切済み
- Windows XP
- ウィンドウ生成時の不具合について
VC++6.0 WIN98 MFCにて ウィザードを使ってSDIにてウィンドウ1を作成し、メニューをクリックすることで、ウィンドウ2が新たに生成されるプログラムを書きました。 ウィンドウ2が生成されたときに、ウィンドウ1に重なっていると、ウィンドウ2を閉じてもウィンドウ1のクライアント領域にウィンドウ2の形が残ったままになってしまいます。 どうしてこうなるのでしょうか?
- ベストアンサー
- C・C++・C#
- ウィンドウを初期位置に戻したい!
初めて質問します。 表題についていろいろと検索を掛けてみたのですが解決策は見当たりませんでした。。。 1)ウィンドウの大きさを指定したサイズで固定させる [shift]を押しながらウィンドウ右上の×ボタンをクリックして閉じる (例:InternetExplorer を毎回最大サイズで表示したいとき) 2)ウィンドウを好きな場所へ移動させる ウィンドウをアクティブにしたうえで a.ウィンドウが画面上に見えるとき →タイトルバーを掴んでドラッグ&ドロップ b.ウィンドウが画面上に見えないとき →[Alt]+[space]を入力したのち[M]を押す →任意のカーソルキー(↑↓←→)を1回押す →タイトルバーの中央を掴んだ状態になるので ウィンドウが見えるようにマウスを動かしたあとクリック →上記a.に続く というのが調べた結果です。しかし、自分で移動させたあとWindowsの機能によりウィンドウが位置記憶されてしまい、上記2)a.の方法でなんとなく初期位置に移動させることはできても、まったくの初期位置に戻せません。 噛み砕いて言うと、アプリケーション初回立上げ時はウィンドウがしっかり画面中央に表示されていたのに自分で移動させたため毎回その位置で開かれてしまう、けれど初回立上げ時のようにキッチリ画面中央に表示させてスッキリしたい、というわがままな不満です。 これを解決する方法がありましたら是非教えてください。 よろしくお願いします。m(_ _)m
- ベストアンサー
- Windows 7
- SDIのクライアント領域に子ウィンドウを生成するには?
環境 Win98 VC++6.0 MFCにて http://www.kumei.ne.jp/c_lang/sdk/sdk_50.htm ↑のように、SDIにてクライアント領域に子ウィンドウを生成するには、MFCの場合どうすれば良いのでしょうか? いつも質問ばかりで申し訳ありません。 ご存知の方お願いいたします。
- ベストアンサー
- C・C++・C#
- ウィンドウの移動
Win8でデスクトップ上に開いたウィンドウを移動する方法を教えて下さい。 知りたいのは「マウスでウィンドウの上部を左クリックしてドラッグ&ドロップ」や「タッチパネルの操作」以外の操作です。 なぜそんなことが知りたいかというと、マルチディスプレイで電源が入っていないディスプレイに表示されているウィンドウを電源を入れ直したりせずに写っている方のディスプレイに短い手順で移動したいからです。 XPの場合はタスクバー上のアイコンを右クリックして移動(正確な名前ではないかもしれません)を選択してドラッグ&ドロップかまたは矢印ボタンで移動できましたがWin8には見当たらないので。
- ベストアンサー
- Windows 8
- タイトルバークリックでウインドウが最大化?
WinXP-SP3,IE8,Office2003などです。 今更ながら気が付いた現象なんですが、IE8でもExcelでもWordでも、ウインドウの位置を移動する目的でタイトルバーのある箇所(具体的に私の知識では言葉で特定出来ない箇所)をクリックしてドラッグしょうとすると、急にウインドウが最大化されるんです。 これはどういうことなんでしょうか。この現象を止めさせることはできないんでしょうか。
- ベストアンサー
- Windows XP
- お気に入りの移動が出来ないのですが^^;
先ほど増えすぎだお気に入りを整理しようと 思いフォルダ分けをしようとしたところ。 マウスでクリックしたままドラッグして位置を変えようとしてもお気に入りの位置が変わらずにその場に 残ってしまうようになってしまいました^^; 一応動かせるのですが指定した位置に移動しないと いう現状なのですが、これはウィルスでしょうか^^; デスクトップのアイコンも同じ状況になってしまった のですが・・・; OSはNEC製 WINXPホームエディションです。 どなたか対処方法ご存知でしたら教えてください。
- ベストアンサー
- デスクトップPC
- SmartVisionの画面が移動できません
SmartVisionを、タイトルバーの縮小を押して小さな画面で見ていました。 移動させた時に上部が画面から切れてしまい、タイトルバーが見れなくなってしまいました。 フルスクリーンの時は、問題なくみられるのですが、 タイトルバーの縮小を押して小さな画面に切り替えると、 上部タイトルバーと画面も一部はみだしてしまって、見ることができません。 画面をマウスで大きくしたり、小さくしたりは出来るのですが、移動させることが出来ません。 マウスの左クリックもしてみましたが、何も出てきません(;;) どうにか直す方法があったら教えてください><
- ベストアンサー
- Windows Vista
- デスクトップ位置の移動方法を教えて下さい。
Windows搭載のPCで、デスクトップの大きさが画面より大きく、画面に映す 位置を切り替えられる(画面上端、下端にマウスを持って行くとそちらの方向 に視野を移動できる)PCが有ると思うのですが、そういう風にするためには どこの設定をすればよいのでしょうか。 xpまたはvistaの場合で教えて下さい。
- ベストアンサー
- Windows系OS
- フレームウィンドウを隠す(非表示)
Win2000,VC++6.0,MFCを使用しています。 Windows Media Playerの表示オプションでは「メニューバーを自動的に隠す」という設定が有ります。 これはMFCでいうCFrameWndをマウスの位置によって表示←→非表示に切替えているように見えます。 このようにクライアントウィンドウは表示したままでフレームウィンドウだけ非表示にする方法、或いは別の手法であればその方法を教えて頂ければ有り難く思います。 今のところどうすれば可能なのか検討もつきません。 宜しくお願い致します。
- ベストアンサー
- C・C++・C#
お礼
ありがとうございます。 やっとこさ出来ました。 winproc内のWM_MOVEで oldRect = newRect GetWindowRect(newRect) としてひとつ前のRECTを保存 DefWinProcのWM_NEXTSIZE(ドラッグ終了後、自動移動後に送られてくる) で一つ前の位置newRectに SetWindowRect です。 ありがとうございました。
補足
位置newRect→位置oldRect ↓↓↓↓↓↓↓↓↓