No.3ベストアンサー
- 回答日時:
★過去に『WM_NCLBUTTONUPについて』という質問に回答しました。
・でも、この方法は今回使えないかもしれませんね。多分?
http://oshiete1.goo.ne.jp/qa2710782.html→『WM_NCLBUTTONUPについて』
試していませんので、上記の質問を参照してテストしてみませんか?
・以上。結果報告待ってます。
参考URL:http://oshiete1.goo.ne.jp/qa2710782.html
ありがとうございます。
やっとこさ出来ました。
winproc内のWM_MOVEで
oldRect = newRect
GetWindowRect(newRect)
としてひとつ前のRECTを保存
DefWinProcのWM_NEXTSIZE(ドラッグ終了後、自動移動後に送られてくる)
で一つ前の位置newRectに
SetWindowRect
です。
ありがとうございました。
No.2
- 回答日時:
★申し訳ありません。
・前回の回答は、勘違いしていました。
私も自動的に戻ってしまう動作を阻止する方法が分かりません。
『DefWindowProc』が何かの動作を行っているようですが…。推測ですが
『WM_MOVING』中でマウスの左クリックが離されてから『WM_EXITSIZEMOVE』
メッセージが発生する間で、戻る動作を行っているかもしれません。→内部で。
・私にも今のところ詳しく分かりません。ごめんなさい。
他の回答者さんを待ってみて下さい。
アイディア:
・『DefWindowProc』の『WM_NCLBUTTONDOWN』メッセージと同等な処理を
自分で実装して、『DefWindowProc』の『WM_NCLBUTTONDOWN』メッセージを
殺せば自動的には戻らないと思いますが…。試していませんのでヒントです。
・なお、自分で同等機能の実現方法としては、クライアント領域をクリック中に
マウスの移動に変化があったらば、ウインドウも一緒に移動するようにします。
・このとき、タイマー処理で約 200 msくらいの間隔でマウス座標をチェックして
200 ms前の位置とずれていたらば、ずれた分だけウインドウも移動するように
すればよいと思います。
・以上。おわり。→『WM_NCLBUTTONDOWN』もタイマー処理などを使っていそうです。
いえ、丁寧な回答ありがとうございます。
当方も、位置情報を保存する方法で試行錯誤しているのですが、
どのメッセージの合間がいいのか?、自動位置変更の判別条件等が
かなりシビアで困っているところです。
タイマーは最後の手段で・・・
WM_NCLBUTTONUPにクライアントのクリックでも
メッセージが飛んで来れば良いのですが・・・
No.1
- 回答日時:
★クライアント領域のウインドウ移動は『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』もどうぞ。
参考URL:http://www.winapi-database.com/Message/WM/WM_MOV …
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・あなたの人生で一番ピンチに陥った瞬間は?
- ・初めて見た映画を教えてください!
- ・今の日本に期待することはなんですか?
- ・【大喜利】【投稿~1/31】『寿司』がテーマの本のタイトル
- ・集中するためにやっていること
- ・テレビやラジオに出たことがある人、いますか?
- ・【お題】斜め上を行くスキー場にありがちなこと
- ・人生でいちばんスベッた瞬間
- ・コーピングについて教えてください
- ・あなたの「プチ贅沢」はなんですか?
- ・コンビニでおにぎりを買うときのスタメンはどの具?
- ・おすすめの美術館・博物館、教えてください!
- ・【お題】大変な警告
- ・【大喜利】【投稿~1/20】 追い込まれた犯人が咄嗟に言った一言とは?
- ・洋服何着持ってますか?
- ・みんなの【マイ・ベスト積読2024】を教えてください。
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・最強の防寒、あったか術を教えてください!
- ・【大喜利】【投稿~1/9】 忍者がやってるYouTubeが炎上してしまった理由
- ・歳とったな〜〜と思ったことは?
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
vbaから他のアプリを終了
-
SetWindowText関数について
-
テキストボックスでコンテキス...
-
msgboxの表示位置
-
VBでRegisterWindowMessage関数...
-
メッセージボックスの選択ボタ...
-
点滅で知らせる方法
-
アプリケーション間での操作
-
有効でないウインドウハンドル...
-
システム例外のメッセージを変...
-
VBAでコントロールのハンドルを...
-
グローバルフックについて
-
マウスホイールをフックしたい
-
windows終了時のメッセージにつ...
-
WM_CTLCOLORDLG
-
他のウィンドウのボタンを自動...
-
エクセルで作った新しいウイン...
-
「アイテムは収集されました」...
-
コントロールの書式設定で、“コ...
-
グラフの交点の求め方(Excel)
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
vbaから他のアプリを終了
-
他のウィンドウのボタンを自動...
-
VBAでコントロールのハンドルを...
-
msgboxの表示位置
-
メッセージボックスの選択ボタ...
-
VBA 複数セルが空白なら印刷さ...
-
メッセージハンドラ
-
VB.netでFindWindowExやると・...
-
WM_NCLBUTTONUPについて
-
SendMessage で ESC など
-
チェックボックスのキーダウン...
-
デスクトップ上のアイコンの位...
-
点滅で知らせる方法
-
CloseHandle()
-
SetWindowText関数について
-
VB.netでSendMessageを使用して...
-
キーボード入力をHSPでさせたい...
-
Excel VBA で外部アプリケーシ...
-
windows終了時のメッセージにつ...
-
VBA アクティブウインドウの取...
おすすめ情報