
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で質問しましょう!
似たような質問が見つかりました
- Chrome(クローム) Google Chromeのブラウザ(PC)ウインドウの移動について 3 2022/07/19 15:14
- その他(OS) MacのFinder操作について 2 2022/07/13 07:29
- マウス・キーボード タッチパッドでドラッグしたい 1 2023/08/08 20:41
- その他(OS) Mac OSの操作について 2 2022/06/08 09:19
- PDF Just PDF 5 proでポップアップしたファイル名がつきまとう 2 2022/12/18 09:56
- マウス・キーボード マウスのないパソコン 9 2022/03/30 10:53
- 画像編集・動画編集・音楽編集 gomcamの起動にブロックがかかる 1 2023/07/28 23:34
- Visual Basic(VBA) VBA 画面上のカーソルに文字数字を入力するコードを教えて下さい 1 2022/10/30 10:31
- Excel(エクセル) Excelで図の書式設定を移動したい 1 2022/10/07 15:32
- Chrome(クローム) 最近Win10にてブラウザが左にスッと隠れていく現象に悩まされてます 3 2023/07/22 23:11
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
msgboxの表示位置
-
VB.netでFindWindowExやると・...
-
SetWindowText関数について
-
vbaから他のアプリを終了
-
VBAでコントロールのハンドルを...
-
システム例外のメッセージを変...
-
メッセージボックスの選択ボタ...
-
VC++(MFC)でタスクバーに常駐し...
-
WM_CTLCOLORDLG
-
警告メッセージのセキュリティ...
-
コールバック関数とは…(C言語)
-
ウインドウの位置を知る。
-
LINEのトークって、期限を切っ...
-
ウインドウ位置の自動移動の解除
-
エクセルで作った新しいウイン...
-
コントロールの書式設定で、“コ...
-
Minecraft 統合版(PC)の描画距...
-
JTableのヘッダー文字のサイズ変更
-
グラフの交点の求め方(Excel)
-
「アイテムは収集されました」...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
vbaから他のアプリを終了
-
他のウィンドウのボタンを自動...
-
メッセージボックスの選択ボタ...
-
msgboxの表示位置
-
SendMessage で ESC など
-
VBAでコントロールのハンドルを...
-
SetWindowText関数について
-
VBA 複数セルが空白なら印刷さ...
-
点滅で知らせる方法
-
チェックボックスのキーダウン...
-
デスクトップ上のアイコンの位...
-
CloseHandle()
-
メッセージループについて
-
メッセージハンドラ
-
VB.netでSendMessageを使用して...
-
システム例外のメッセージを変...
-
Excel VBA で外部アプリケーシ...
-
マウスの右クリック+Shiftキー...
-
キーボード・フックのアプリを...
-
windowsメールスロットについて...
おすすめ情報