環境: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
すみません、Module1に
Public Structure Rect
Public left As Integer
Public top As Integer
Public right As Integer
Public bottom As Integer
End Structure
もあります。
VBでの記法はよく覚えてませんがGetWindowRectの第二引数はByValではダメだと思いますよ、関数側がデータを格納しなければなりませんので。
> また、この関数の宣言部分が"user32.dll"や"USER32"など、
最後のdllはない場合補われますので問題ありません。あと、大文字小文字は区別しませんのでこれも問題なしです。
>VBでの記法はよく覚えてませんがGetWindowRectの第二引数はByValではダメ>だと思いますよ、関数側がデータを格納しなければなりませんので。
なるほど〜、たまに見かけるByRefでやってみたら通りました!
VB始めた頃、どこかで解説を読んだ気がしますが日本語であって日本語でないな〜といった感じで、サッパリでした。こういう事を言ってたんですね。
>最後のdllはない場合補われますので問題ありません。
>あと、大文字小文字は区別しませんのでこれも問題なしです。
なるほど、了解です。
たかみちえ様、ありがとうございます。
ツイート | ![]() |