

お世話になります。
VB6でメインフォーム(*.exeで起動されるフォーム)がデスクトップ内で移動したことをそのフォーム自身が知るためにはどのようにすればよいでしょうか。
目的は、移動後のフォームの位置情報の取得です。
フォームのサイズを変更した時は"Resize"イベントが発行されるので、それをきっかけにLeft,Top情報を取得できます。
同じようにフォームが移動した時にLeft,Top情報を取得する方法を知りたいです。
API等の利用で可能になるのであればそれでもかまいません。
よろしくお願いします。
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などは使えますが ・・・
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
モーダルフォームとモードレス...
-
ユーザーフォームを表示中にシ...
-
パソコンの画面に合わせてユー...
-
クリックイベントなのに、2回ク...
-
Hideについて(.NET)
-
ユーザーフォームのラベルに時...
-
ExcelVBAのユーザーフォームの...
-
【Excel VBA】ユーザフォームを...
-
ユーザーフォーム上に現在日時...
-
コントロールの存在確認
-
VBA(エクセル)のユーザー...
-
ExcelVBAでユーザーフォームが...
-
フォームを最背面に設定したい...
-
CheckBoxのチェックを初期状態...
-
オブジェクト(コントロール)...
-
ユーザーフォームを常時表示さ...
-
Excelにて、ユーザーフォームで...
-
重複した名前が見つかりました。
-
なぜエラーになるのでしょう?...
-
VBAでユーザーフォームを再表示...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ユーザーフォームを表示中にシ...
-
ExcelVBAのユーザーフォームの...
-
クリックイベントなのに、2回ク...
-
Microsoft Formsの「個人情報や...
-
Form_Load と Form_Activate の...
-
ユーザーフォーム上に現在日時...
-
VB.NETでフォームロード中のエ...
-
Hideについて(.NET)
-
Excelにて、ユーザーフォームで...
-
VBAでユーザーフォームを再表示...
-
VBAのテキストフォームの折り返...
-
モーダルフォームとモードレス...
-
ユーザーフォームのラベルに時...
-
VBA(エクセル)のユーザー...
-
コントロールの存在確認
-
エクセルVBAのフォームを最...
-
ACCESSのフォーム、開くんです...
-
Accessで、一つのフォーム画面...
-
【VBAユーザーフォームで閉じる...
-
パソコンの画面に合わせてユー...
おすすめ情報