• ベストアンサー

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
質問者

お礼

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

関連するQ&A

  • アクセス フォームの中の直線移動

    フォームにイメージと直線を2本(水平線・垂直線)を置いています。 イメージの中でマウスボタンが押されたら、この直線がそのポイントをクロスするように移動させたいのですが・・ マウスのポイントは x,y(座標 ドット?) で取得できますが、直線を移動させる時 cmで単位があいません。 感じとしては 水平線.Top =イメージ.Top + Y * ??? 垂直線.Left =イメージ.Left + X * ??? としたいのですが ???にあたる係数はいくつになるのか、どなたか教えて頂けませんか?

  • VBでWin32APIを使う方法

    VB2010を触っていて、Webで情報を拾いながらコードを作成しています。 .NetFrameWorkではクラスで対応できない時にWin32APIを使うとありました。 この記述はVB2005の時のもので、やや旧いです。 VBの版が進むと使えるクラスも多くなって、APIの出番はますますなくなっているのでしょうか? 取り敢えず現在使いたいAPIはVB6からのコピーでSHGetSpecialFolderLocationと GetSystemDirectoryの2つです。これはクラスで代用可能ですか。 それともAPIでやるべきなのでしょうか。 現在APIで記述しています。リビルドでパラメータのエラーが出て止まっています。 ちょっと手探り状態で作業を進めているため、的が外れていたら済みません。 ソースは以下のようになっています。   ws = GetSystemDirectory(sysDir, MAX_PATH)   GetSystemDir = Left$(sysDir, InStr(sysDir, vbNullChar) - 1)

  • VBのフォームをスクロールさせるには

    VB6.0+WinXP環境です。 VBのフォームがありそのフォームは大きさを自由に変えられるとします。フォームを小さくした時に、フォーム上のボタンなどが、表示から隠れてしまいますが、フォームに水平および垂直スクロールバーをつけて、スクロールさせて表示できるようにしたいと思います。 簡単なコントロールを配置するだけで可能ですか。それともスクロールコントロールを配置して、座標やフォームの大きさや移動具合などを考慮して、プログラムをつくり込まないと駄目でしょうか。

  • フォームがリサイズされた時の各コントロールの位置変更コードについて

    教えてください。 前々から疑問だったのですが、VBでフォームをリサイズした場合に それぞれのコントロールもそれに合わせて大きさが変更されたり 移動したりという状態にするには、当然Form_Resizeのコードを 書く必要があると思うのですが、VBでツールを作成される方は 皆さんひとつひとつのコントロールの位置を計算しながら毎回 コードを書いているのでしょうか? OCXなどを使うと、勝手にコントロールの位置を調整してくれるものも ありますが、やはり皆さん自分でコードを書いていらっしゃるのでしょうか? 私が分かるのは、フォームにテキストボックスのみを貼り付けて、 Private Sub Form_Resize() Form1.text1.Top = 0 Form1.text1.Left = 0 Form1.text1.Width = ScaleWidth Form1.text1.Height = ScaleHeight End Sub と書くと、リサイズに合わせてテキストボックスが画面いっぱいにサイズ変更 するというものです。 コマンドボタンとか色々貼り付けた状態ではどのように書けばいいのか いまひとつ分かりません。 皆さんはどのようにされているのでしょうか? 是非是非教えてください。

  • 【VB2005】別のプログラムから別のプログラム起動

    "A"というVB2005で、作成したプログラムがありまして、 メインのフォームがあり、 そこにボタンがあります。 Shellの関数を使って、クリックイベントで、 指定したExe"B"を立ち上げます。 そのExe"B"は、VB2005で作成したオリジナルのプログラムです。 プロジェクトは別で作った物と考えてください。 Exe"B"を起動した画面を[フォーム1]と考えて、 ボタンがあり、クリックすると 別の[フォーム2]が表示するはずなのですが、 特にエラーも掴まずに、Showで開くことができません。 しかし、Exe"B"からダイレクトに起動させて ボタンをクリックしたら[フォーム2]が表示されます。 どうしたら、Exe"A"からExe"B"を起動して Exe"B"からフォーム2を呼び出すことができるか、 考えられる要因などをアドヴァイスして頂けたら助かります。

  • フォームの呼び出しについて

    VB.NETで メインのEXEとサブのDLLに分けて作っています。 EXEからDLL内のフォームを表示させようとする場合ですが、 VB.NETではどのように呼ぶべきなのでしょうか? VB6の頃は、EXEからDLL(ActiveX DLL? )のフォームが直接呼べなくて、 EXE側 Dim dll as new DLLClass dll.FormShow() DLLのクラス(DLLClass) Sub FormShow() DllForm.Show みたいに、DLL内のクラスのメソッドをコールし、 その中で、フォームを表示するという手順で呼び出してました。 VB.NETではFormもクラスなので、EXEからDLL(クラスライブラリDLL)内のフォームを 直接呼んでもいいように思うのですが(実際直接呼べる)、 カプセル化というのを考えたときに、フォームを直接呼ぶのではなく、 コントロールするクラスを経由して(VB6のときの方式)呼び出すべきなんじゃないかなと思うのです。 どちらがよいのでしょうか?

  • VB.NETとEXE

    VB.NETで作成したフォーム(仮にメインフォームとします)にコマンドボタンを複数貼り付けています。 各コマンドボタンをクリックすると、それぞれの別のEXEが起動します。 (例 コマンドAをクリックすると、EXE-Aが起動、コマンドBをクリックするとEXE-Bが起動。両方一度に起動も可) この時、必ずメインフォームの上にEXEのフォームが重なるように表示されています。 そこで質問があります。 1、複数EXEが起動されている時、一番前面に表示されているEXEを識別する方法はありますか? 「現在アクティブなEXE」とは異なります。なぜなら、メインフォームをクリックすると、前面に表示されているEXEはアクティブな状態とはならないためです。 2、メインのフォームの右上にある「最大化」や「最小化」のボタンをクリックしたら、それに連動してEXEも最大化や最小化をするようにすることは可能でしょうか? すこしわかりにくいと思いますが、補足もしますので、アドバイスよろしくお願いします。

  • VB6.0のレジストリ情報取得方法

    VB6でレジストリの情報取得について、質問いたします。 VBにて、レジストリのセクション名を取得(検索して存在するなら真の値を返すだけでもよい)したいのですが、APIとか関数はあるのでしょうかまたは、出来るのでしょうか?調べた限り見つからない・・・・(-_-; 宜しくお願いします。

  • VB.NETでフォームの画像を取得したい

    VB.NETでフォームに表示されている内容(画像のイメージ)を取得したいのですがその方法が判りません。最終的には、その内容を印刷したいのですが、まずその内容を取得するにはどうしたら良いでしょうか。Alt+PrintScreenキーを押下したイベントを発生させる方法は、除きます。

  • VB.NETからエクセルを起動して、エクセルでVBを閉じたい。

    こんにちは。 先日、エクセルのフォームを最前面に配置したいという 質問をさせて頂いたものでございます。 それで、SetWindowPosのAPIで設定する方法を教えて頂いたのですが、 最前面にする事は出来たのですが、フォームを動かすと ブックはその一つ下に現れてしまい、 ブックを最背面に配置するなどを試みてみたのですが、 どうもうまく行かないので、 エクセルから直に立ち上げることが出来ないようにして VB.NETのフォームを作ってエクセルにデータを送ろうかと思いました。 それで、データを送る方法は何とかなりそうなのですが、 VB.NETのフォームからエクセルを起動して、 次にエクセルからそのフォームを出したり、隠したりしたいのですが、 その場合、VB.NETのフォームのなんと言うハンドルを取得すればよいでしょうか? IDにも色々あるようで、どれを使えばよいのか分からなくなってしまいました。 そのIDはVBのフォームを起動した時に、エクセルと共有するiniファイルなどに、書き込んでおこうかと思っています。 よろしくお願いいたします。m(__)m