• ベストアンサー

VB6 自分自身のフォームが移動したことを知る方法

お世話になります。 VB6でメインフォーム(*.exeで起動されるフォーム)がデスクトップ内で移動したことをそのフォーム自身が知るためにはどのようにすればよいでしょうか。 目的は、移動後のフォームの位置情報の取得です。 フォームのサイズを変更した時は"Resize"イベントが発行されるので、それをきっかけにLeft,Top情報を取得できます。 同じようにフォームが移動した時にLeft,Top情報を取得する方法を知りたいです。 API等の利用で可能になるのであればそれでもかまいません。 よろしくお願いします。

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

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

Fromをサブクラス化して WM_MOVEメッセージを捕まえてみましょう 標準モジュールを追加して以下のコードを記述します Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" _   (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, _   ByVal Msg As Long, ByVal wParam As Long, _   ByVal lParam As Long) As Long Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _   (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long Const GWL_WNDPROC = (-4) Const WM_MOVE = &H3 Public lpfnProc As Long Public nTop As Integer, nLeft As Integer Public Function myProc(ByVal hWnd As Long, ByVal uMsg As Long, _   ByVal wParam As Long, ByVal lParam As Long) As Long   If uMsg = WM_MOVE Then     Dim x As Long, y As Long     x = Form1.Left     y = Form1.Top     If (x <> nLeft) Or (y <> nTop) Then       MsgBox x - nLeft & " - " & y - nTop       nLeft = x       nTop = y     End If   End If   myProc = CallWindowProc(lpfnProc, hWnd, uMsg, wParam, lParam) End Function From1のLoadイベントなどで nTop = Me.Top nLeft = Me.Left lpfnProc = SetWindowLong( ME.hWnd, GWL_WNDPROC, Addressof myProc ) と記述します いったん保存してから実行してください サブクラス化した場合 VB6のIDEのブレークポイントによるデバッグはしないようにしてください ブレークポイントを使うと IDEがクラッシュします Debug.PrintやMsgBoxなどは使えますが ・・・

pac-pac
質問者

お礼

ありがとうございました。