環境:VB.NET2002
よろしくお願いします。
フォームクリックでデスクトップ画像をフォームのクライアント領域に表示する様にしたいです。
色々調べ、APIを使って以下のようにコードを書きましたが無反応です。
何か見落としているのでしょうか…
===============================
Public Class Form1
Inherits System.Windows.Forms.Form
…Windows フォーム デザイナで生成されたコード…
Private Sub Form1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Click
Dim hWnd, dWnd, hDesk, dDesk As Long
'フォーカスのあるウィンドウとそのデバイスコンテキストのハンドルを取得
hWnd = GetFocus
dWnd = GetDC(hWnd)
'デスクトップウィンドウとそのデバイスコンテキストのハンドルを取得
hDesk = GetDesktopWindow
dDesk = GetDC(hDesk)
'コピー
BitBlt(dWnd, 0, 0, 100, 100, dDesk, 0, 0, &HCC0020)
'フォームを再描画
Me.Refresh()
'ハンドルを解放
ReleaseDC(hWnd, dWnd)
ReleaseDC(hDesk, dDesk)
End Sub
End Class
===============================
Module Module1
Declare Function GetDesktopWindow Lib "user32" () As Long
Declare Function GetFocus Lib "user32.dll" () As Long
Declare Function ReleaseDC Lib "user32.dll" _
(ByVal hWnd As Long, ByVal hdc As Long) As Long
Declare Function GetDC Lib "user32.dll" (ByVal hWnd As Long) As Long
Declare Function BitBlt Lib "gdi32" _
(ByVal hDestDC As Long, _
ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, _
ByVal hSrcDC As Long, _
ByVal xSrc As Long, ByVal ySrc As Long, _
ByVal dwRop As Long) As Long
End Module
とりあえず、データ型に大きな問題があるような。
hDC 等のハンドルは、通常は IntPtr (あるいはせめて、Integer)で
宣言されるべきであって、Long で扱うのは問題があるかと。
GetDesktopWindowはいらないんじゃないですか?
GetDCの引数0にすればデスクトップじゃなかったでしたっけ?
久しぶりです。
上記のソースのMe.Refresh()をコメントにしたら、描画できました。
後、LongをIntegerにして、GetDCの第1引数の値を0にしました。
魔界の仮面弁士様
>hDC 等のハンドルは、通常は IntPtr (あるいはせめて、Integer)で
宣言されるべきであって、Long で扱うのは問題があるかと。
MSDN、その他の資料には"Long"型で載っていたのでそのまま使っていました。(^^;
謎です(未熟な私にとって)。何となくですが、"16BitのLong" = "32BitのInteger"?(不安)といった感じが理由でしょうか…?
通りすがり様
>GetDesktopWindowはいらないんじゃないですか?
GetDCの引数0にすればデスクトップじゃなかったでしたっけ?
まさにその通りでした。便利ですね。
マグ様
はい、お久しぶりです。ずいぶん前なのに覚えて頂けてたんですね。
>上記のソースのMe.Refresh()をコメントにしたら、描画できました。
なるほど、直後に"フォーム"が描かれちゃうんで消えてしまっていたんですね。私は逆にRefreshしないと反映されないものと認識していました。
正確には違っているかもしれませんが、ひとまずこう考えときます。
魔界の仮面弁士様、通りすがり様、マグ様、有り難うございました。
これを足がかりにさらなる深みにハマって参りたいと…いや向上して行きたいと思います。
ツイート | ![]() |