デスクトップの画像をフォームに表示

解決


こん  2005-04-04 09:13:10  No: 120663

環境: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


魔界の仮面弁士  2005-04-04 18:09:28  No: 120664

とりあえず、データ型に大きな問題があるような。

hDC 等のハンドルは、通常は IntPtr (あるいはせめて、Integer)で
宣言されるべきであって、Long で扱うのは問題があるかと。


通りすがり  2005-04-04 19:00:03  No: 120665

GetDesktopWindowはいらないんじゃないですか?
GetDCの引数0にすればデスクトップじゃなかったでしたっけ?


マグ  2005-04-04 21:20:25  No: 120666

久しぶりです。

上記のソースのMe.Refresh()をコメントにしたら、描画できました。
後、LongをIntegerにして、GetDCの第1引数の値を0にしました。


こん  2005-04-05 00:01:06  No: 120667

魔界の仮面弁士様
>hDC 等のハンドルは、通常は IntPtr (あるいはせめて、Integer)で
宣言されるべきであって、Long で扱うのは問題があるかと。

MSDN、その他の資料には"Long"型で載っていたのでそのまま使っていました。(^^;
謎です(未熟な私にとって)。何となくですが、"16BitのLong" = "32BitのInteger"?(不安)といった感じが理由でしょうか…?

通りすがり様
>GetDesktopWindowはいらないんじゃないですか?
GetDCの引数0にすればデスクトップじゃなかったでしたっけ?

まさにその通りでした。便利ですね。

マグ様
はい、お久しぶりです。ずいぶん前なのに覚えて頂けてたんですね。

>上記のソースのMe.Refresh()をコメントにしたら、描画できました。

なるほど、直後に"フォーム"が描かれちゃうんで消えてしまっていたんですね。私は逆にRefreshしないと反映されないものと認識していました。
正確には違っているかもしれませんが、ひとまずこう考えときます。

魔界の仮面弁士様、通りすがり様、マグ様、有り難うございました。
これを足がかりにさらなる深みにハマって参りたいと…いや向上して行きたいと思います。


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

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






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