2009-05-07 4 views
3

デスクトップの背景(壁紙)を置き換えるように、Windowsデスクトップにカスタム図面を作成したいと思います。私は、その後のNativeWindowを作成し、デスクトップにネイティブウィンドウのハンドルを割り当てることにより、WM_PAINTメッセージをキャプチャし、私自身の描画を実行しようとしましたデスクトップの壁紙を置き換える/デスクトップに描画する

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

、しかし:私の最初の試みはdesktopListViewのためにDCを取得し、それを描くことでしたデスクトップにメッセージが表示されませんでした。

理想的には、私はWPFではこれを行いたいが、Windowsフォームではしたくない。 WPFウィンドウをどのように作成するかは、デスクトップアイコンの下にありますが、マウスのメッセージは無視されデスクトップは正常に動作します。

答えて

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); 


     } 

    } 
+1

ありがとうございます。子供を既存のウィンドウに追加する方を教えてください。私はこれを行うための明白なAPI関数が表示されません。 –

+0

それはすべてのピンボケのものです - 私はこれをしてから数年が経ちましたが、私はあなたがsethwndparentまたはsetwindowを探したいと思うと思います。 –

+0

フォームを作成し、デスクトップのリストビューの子として追加することは、ほとんど機能しているようです。このフォームは他のすべてのウィンドウの下にありますが、アイコンの上にあります。どのようにして本当にバックグラウンド/壁紙を元に戻すことができますか? –

1

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

+0

これは、若干異なる結果をもたらします。ウィンドウがデスクトップの子ウィンドウの前に表示され、デスクトップの表示機能が消えてしまうと思います。 –

関連する問題