ウィンドウのRECT構造体の取得

解決


こん  2005-04-10 11:18:50  No: 120781

環境:VB.NET2002
いつもお世話様です。
少し前にデスクトップの画像の取得についてご回答頂いた者です。
APIを使用し、ウィンドウの位置を取得しようとネット上のサンプルなどを
参考に、以下のように書きましたが

「オブジェクト参照がオブジェクト インスタンスに設定されていません。」

とよく見かけるエラーが「GetWindowRect(hMoto, R)」の部分で出ます。
他の関数と同じようにしているのに、なぜでしょうか?

また、この関数の宣言部分が"user32.dll"や"USER32"など、
資料によって異なるのですがどちらでも良いのですか?
よろしくお願いします。
------------------------------------------------------------------
Form1

 Private Sub MenuItem3_Click(〜) Handles MenuItem3.Click
        Me.Hide
        Dim hMoto, hMotoDC, hBit, hMemo As IntPtr
        Dim MotoW, MotoH As Integer
        'コピー元のウィンドウ・DCハンドル取得
        hMoto = GetForegroundWindow()
        hMotoDC = GetDC(hMoto)

        Dim R As Rect
        GetWindowRect(hMoto, R)    ****ここでエラー****
        MotoW = R.right - R.left
        MotoH = R.bottom - R.top

    End Sub
--------------------------------------------------------------
Module1
Declare Function GetWindowRect Lib "user32" _
        (ByVal hWnd As IntPtr, ByVal lpRect As Rect) As IntPtr
Declare Function GetForegroundWindow Lib "user32.dll" () As IntPtr


こん  2005-04-10 11:20:43  No: 120782

すみません、Module1に

Public Structure Rect

        Public left As Integer
        Public top As Integer
        Public right As Integer
        Public bottom As Integer

End Structure

もあります。


たかみちえ  URL  2005-04-10 20:46:18  No: 120783

VBでの記法はよく覚えてませんがGetWindowRectの第二引数はByValではダメだと思いますよ、関数側がデータを格納しなければなりませんので。

> また、この関数の宣言部分が"user32.dll"や"USER32"など、
  最後のdllはない場合補われますので問題ありません。あと、大文字小文字は区別しませんのでこれも問題なしです。


こん  2005-04-11 02:09:56  No: 120784

>VBでの記法はよく覚えてませんがGetWindowRectの第二引数はByValではダメ>だと思いますよ、関数側がデータを格納しなければなりませんので。

なるほど〜、たまに見かけるByRefでやってみたら通りました!
VB始めた頃、どこかで解説を読んだ気がしますが日本語であって日本語でないな〜といった感じで、サッパリでした。こういう事を言ってたんですね。

>最後のdllはない場合補われますので問題ありません。
>あと、大文字小文字は区別しませんのでこれも問題なしです。

なるほど、了解です。

たかみちえ様、ありがとうございます。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加