3

デスクトップの背景 (壁紙) を置き換えるように、Windows デスクトップにカスタム描画を行いたいと考えています。私の最初の試みは、DC を取得しdesktopListViewてそれに描画することでした。

IntPtr desktopDC = GetWindowDC(desktopListView);
Graphics g = Graphics.FromHwnd(desktopDC); //<-- fails on out of memory error

次に、NativeWindow を作成しWM_PAINT、ネイティブ ウィンドウのハンドルをデスクトップに割り当ててメッセージをキャプチャし、独自の描画を試みましたが、デスクトップにメッセージを表示できませんでした。

理想的には、これを Windows フォームではなく WPF で行いたいと考えています。デスクトップアイコンの下に描画できるWPFウィンドウを作成する方法の手がかりはありますが、マウスメッセージを無視してデスクトップが正常に動作し続けるように壁紙の上にありますか?

4

2 に答える 2

2

デスクトップのウィンドウハンドルを取得すると、新しいウィンドウを作成し、その子として独自のカスタムウィンドウを追加できます。リストビューの後ろに置くと、必要な結果が得られる場合がありますが、透明度がどれだけうまく機能するかは100%わかりません。

いくつかのコードが見つかりました-形状が変化する複数の画面を処理する必要がない場合、必要なもののほとんどは最初の部分にあります。

    public void SetDesktopWindows()
    {
        Thread.Sleep(0);
        while (this.Count < Screen.AllScreens.Length)
        {
            OrangeGuava.Desktop.DesktopWindow.DesktopControl dtc = new OrangeGuava.Desktop.DesktopWindow.DesktopControl();
            User32.SetParent(dtc.Handle, User32.FindWindow("ProgMan", null));
            this.Add(dtc);

        }

        int minx = 0;
        int miny = 0;

        foreach (Screen screen in Screen.AllScreens)
        {               
            if (screen.Bounds.Left < minx) minx = screen.Bounds.Left;
            if (screen.Bounds.Top < miny) miny = screen.Bounds.Top;
        }

        for (int i = Screen.AllScreens.Length; i < Count; i++)
        {
            OrangeGuava.Desktop.DesktopWindow.DesktopControl dtc = (OrangeGuava.Desktop.DesktopWindow.DesktopControl)this[i];
            dtc.Hide();
        }

        for (int i = 0; i < Screen.AllScreens.Length; i++)
        {
            OrangeGuava.Desktop.DesktopWindow.DesktopControl dtc = (OrangeGuava.Desktop.DesktopWindow.DesktopControl)this[i];
            dtc.DeviceId = i.ToString();


            Rectangle r = Screen.AllScreens[i].WorkingArea;
            r.X -= minx;
            r.Y -= miny;



            dtc.SetBounds(r.X, r.Y, r.Width, r.Height);

            dtc.displaySettingsChanged(null, null);


        }

    }
于 2009-05-07T15:09:55.570 に答える
1

WM_WINDOWPOSCHANGINGを設定してウィンドウをメッセージに応答させることでこれを行いましたWINDOWPOS.hWndInsertAfter = HWND_BOTTOM。これは OS に対して、自分のウィンドウが他のすべてのウィンドウの下にあることを確認し、自分のウィンドウがデスクトップに接着されているように見せます。

于 2009-05-07T17:06:07.973 に答える