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

바탕 화면의 창 핸들을 얻으면 새 창을 만들고 그 바탕 창으로 사용자 지정 창을 추가 할 수 있습니다. 목록보기 뒤에 배치하면 필요한 결과를 얻을 수 있지만 투명도가 얼마나 잘 작동하는지 확신 할 수는 없습니다.

발견 된 코드 - 모양을 변경하는 여러 화면을 다룰 필요가 없다면 필요한 대부분은 첫 부분에 있습니다.

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

그것은 모든 pinvoke 물건이다 - 내가 이것을했던 이래로 2,3 년이었다. 그러나 나는 당신이 sethwndparent 또는 setwindow를 찾고 싶다라고 생각한다. –

+0

양식을 만들고 바탕 화면 목록 뷰의 자식으로 추가하면 거의 효과가있는 것 같습니다. 양식은 다른 모든 창 아래에 있지만 여전히 아이콘 위에 있습니다. 어떤 생각을 어떻게 배경/배경 화면으로 되돌릴 수 있을까요? –

1

내 창 WINDOWPOS.hWndInsertAfter = HWND_BOTTOM를 설정하여 WM_WINDOWPOSCHANGING 메시지에 응답함으로써 이런 짓을했습니다. 이것은 운영 체제에 말합니다 : 내 창은 다른 모든 창 아래에 있는지 확인하고 창을 바탕 화면에 붙인 것처럼 보이게합니다.

+0

이렇게하면 약간 다른 결과가 발생합니다. 창은 데스크톱의 하위 창 앞에 표시 될 것이므로 데스크톱 표시 기능을 사용하면 사라질 것입니다. –