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