■ 데스크톱 배경 그리기

----------------------------------------------------------------------------------------------------


TestProject.zip


WIN32Helper.cs

 

 

using System;

using System.Runtime.InteropServices;

using System.Text;

 

namespace TestProject

{

    /// <summary>

    /// WIN32 헬퍼

    /// </summary>

    public class WIN32Helper

    {

        //////////////////////////////////////////////////////////////////////////////////////////////////// Delegate

        ////////////////////////////////////////////////////////////////////////////////////////// Public

 

        #region 윈도우 열거하기 프로시저 - EnumWindowsProc(windowHandle, parameterHandle)

 

        /// <summary>

        /// 윈도우 열거하기 프로시저

        /// </summary>

        /// <param name="windowHandle">윈도우 핸들</param>

        /// <param name="parameterHandle">매개 변수 핸들</param>

        /// <returns>처리 결과</returns>

        public delegate bool EnumWindowsProc(IntPtr windowHandle, IntPtr parameterHandle);

 

        #endregion

 

        //////////////////////////////////////////////////////////////////////////////////////////////////// Import

        ////////////////////////////////////////////////////////////////////////////////////////// Static

        //////////////////////////////////////////////////////////////////////////////// Public

 

        #region 윈도우 열거하기 - EnumWindows(enumWindowsProc, parameterHandle)

 

        /// <summary>

        /// 윈도우 열거하기

        /// </summary>

        /// <param name="enumWindowsProc">윈도우 열거하기 프로시저</param>

        /// <param name="parameterHandle">매개 변수 핸들</param>

        /// <returns>처리 결과</returns>

        [DllImport("user32.dll")]

        [return: MarshalAs(UnmanagedType.Bool)]

        public static extern bool EnumWindows(EnumWindowsProc enumWindowsProc, IntPtr parameterHandle);

 

        #endregion

        #region 자식 윈도우 열거하기 - EnumChildWindows(parentHandle, enumWindowsProc, parameterHandle)

 

        /// <summary>

        /// 자식 윈도우 열거하기

        /// </summary>

        /// <param name="parentHandle">부모 핸들</param>

        /// <param name="enumWindowsProc">윈도우 열거하기 프로시저</param>

        /// <param name="parameterHandle">매개 변수 핸들</param>

        /// <returns>처리 결과</returns>

        [DllImport("user32.dll")]

        [return: MarshalAs(UnmanagedType.Bool)]

        public static extern bool EnumChildWindows(IntPtr parentHandle, EnumWindowsProc enumWindowsProc, IntPtr parameterHandle);

 

        #endregion

        #region 윈도우 찾기 - FindWindow(className, windowName)

 

        /// <summary>

        /// 윈도우 찾기

        /// </summary>

        /// <param name="className">클래스명</param>

        /// <param name="windowName">윈도우명</param>

        /// <returns>윈도우 핸들</returns>

        [DllImport("user32.dll", SetLastError = true)]

        public static extern IntPtr FindWindow(string className, string windowName);

 

        #endregion

        #region 윈도우 찾기 - FindWindowEx(parentHandle, childHandle, className, windowTitle)

 

        /// <summary>

        /// 윈도우 찾기 (확장)

        /// </summary>

        /// <param name="parentHandle">부모 핸들</param>

        /// <param name="childHandle">자식 핸들</param>

        /// <param name="className">클래스명</param>

        /// <param name="windowTitle">윈도우 제목</param>

        /// <returns>윈도우 핸들</returns>

        [DllImport("user32.dll", SetLastError = true)]

        public static extern IntPtr FindWindowEx(IntPtr parentHandle, IntPtr childHandle, string className, IntPtr windowTitle);

 

        #endregion

        #region 클래스명 구하기 - GetClassName(windowHandle, className, maximumCount)

 

        /// <summary>

        /// 클래스명 구하기

        /// </summary>

        /// <param name="windowHandle">윈도우 핸들</param>

        /// <param name="className">클래스명</param>

        /// <param name="maximumCount">최대 카운트</param>

        /// <returns>처리 결과</returns>

        [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]

        public static extern int GetClassName(IntPtr windowHandle, StringBuilder className, int maximumCount);

 

        #endregion

        #region 윈도우 텍스트 구하기 - GetWindowText(windowHandle, windowText, maximumCount)

 

        /// <summary>

        /// 윈도우 텍스트 구하기

        /// </summary>

        /// <param name="windowHandle">윈도우 핸들</param>

        /// <param name="windowText">윈도우 텍스트</param>

        /// <param name="maximumCount">최대 카운트</param>

        /// <returns>처리 결과</returns>

        [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]

        public static extern int GetWindowText(IntPtr windowHandle, StringBuilder windowText, int maximumCount);

 

        #endregion

        #region 디바이스 컨텍스트 구하기 (확장) - GetDCEx(windowHandle, clipRegionHandle, flag)

 

        /// <summary>

        /// 디바이스 컨텍스트 구하기 (확장)

        /// </summary>

        /// <param name="windowHandle">윈도우 핸들</param>

        /// <param name="clipRegionHandle">클리핑 영역 핸들</param>

        /// <param name="flag">플래그</param>

        /// <returns>디바이스 컨텍스트 핸들</returns>

        [DllImport("user32.dll")]

        public static extern IntPtr GetDCEx(IntPtr windowHandle, IntPtr clipRegionHandle, DeviceContextFlag flag);

 

        #endregion

        #region 윈도우 표시 여부 구하기 - IsWindowVisible(windowHandle)

 

        /// <summary>

        /// 윈도우 표시 여부 구하기

        /// </summary>

        /// <param name="windowHandle">윈도우 핸들</param>

        /// <returns>윈도우 표시 여부</returns>

        [DllImport("user32.dll")]

        public static extern bool IsWindowVisible(IntPtr windowHandle);

 

        #endregion

        #region 디바이스 컨텍스트 해제하기 - ReleaseDC(windowHandle, deviceContextHandle)

 

        /// <summary>

        /// 디바이스 컨텍스트 해제하기

        /// </summary>

        /// <param name="windowHandle">윈도우 핸들</param>

        /// <param name="deviceContextHandle">디바이스 컨텍스트 핸들</param>

        /// <returns>처리 결과</returns>

        [DllImport("user32.dll", EntryPoint = "ReleaseDC")]

        public static extern IntPtr ReleaseDC(IntPtr windowHandle, IntPtr deviceContextHandle);

 

        #endregion

        #region 타임 아웃을 갖는 메시지 보내기 - SendMessageTimeout(windowHandle, message, wordParameter, longParameter, flag,

            timeout, resultHandle)

 

        /// <summary>

        /// 타임 아웃을 갖는 메시지 보내기

        /// </summary>

        /// <param name="windowHandle">윈도우 핸들</param>

        /// <param name="message">메시지</param>

        /// <param name="wordParameter">WORD 매개 변수</param>

        /// <param name="longParameter">LONG 매개 변수</param>

        /// <param name="flag">플래그</param>

        /// <param name="timeout">타임아웃</param>

        /// <param name="resultHandle">결과 핸들</param>

        /// <returns>처리 결과</returns>

        [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]

        public static extern IntPtr SendMessageTimeout(IntPtr windowHandle, uint message, IntPtr wordParameter, IntPtr longParameter,

            SendMessageTimeoutFlag flag, uint timeout, out IntPtr resultHandle);

 

        #endregion

        #region 윈도우 LONG 설정하기 - SetWindowLong(windowHandle, flag, value)

 

        /// <summary>

        /// 윈도우 LONG 설정하기

        /// </summary>

        /// <param name="windowHandle">윈도우 핸들</param>

        /// <param name="flag">플래그</param>

        /// <param name="value"></param>

        /// <returns>처리 결과</returns>

        [DllImport("user32.dll")]

        public static extern int SetWindowLong(IntPtr windowHandle, WindowLongFlag flag, int value);

 

        #endregion

        #region 윈도우 위치 설정하기 - SetWindowPos(windowHandle, insertAfterWindowHandle, x, y, width, height, flag)

 

        /// <summary>

        /// 윈도우 위치 설정하기

        /// </summary>

        /// <param name="windowHandle">윈도우 핸들</param>

        /// <param name="insertAfterWindowHandle">추가 기준 윈도우 핸들</param>

        /// <param name="x">X 좌표</param>

        /// <param name="y">Y 좌표</param>

        /// <param name="width">너비</param>

        /// <param name="height">높이</param>

        /// <param name="flag">플래그</param>

        /// <returns>처리 결과</returns>

        [DllImport("user32.dll")]

        [return: MarshalAs(UnmanagedType.Bool)]

        public static extern bool SetWindowPos(IntPtr windowHandle, IntPtr insertAfterWindowHandle, int x, int y, int width, int height,

            SetWindowPositionFlag flag);

 

        #endregion

        #region 시스템 매개 변수 처리하기 - SystemParametersInfo(action, parameter1, parameter2, winIni)

 

        /// <summary>

        /// 시스템 매개 변수 처리하기

        /// </summary>

        /// <param name="action">액션</param>

        /// <param name="parameter1">매개 변수 1</param>

        /// <param name="parameter2">매개 변수 2</param>

        /// <param name="winIni">사용자 프로필 업데이트 여부</param>

        /// <returns>처리 결과</returns>

        [DllImport("user32.dll", CharSet = CharSet.Auto)]

        public static extern Int32 SystemParametersInfo(uint action, uint parameter1, string parameter2, uint winIni);

 

        #endregion

    }

}

 

 

MainForm.cs

 

 

using System;

using System.Drawing;

using System.Windows.Forms;

 

namespace TestProject

{

    /// <summary>

    /// 메인 폼

    /// </summary>

    public partial class MainForm : Form

    {

        //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor

        ////////////////////////////////////////////////////////////////////////////////////////// Public

 

        #region 생성자 - MainForm()

 

        /// <summary>

        /// 생성자

        /// </summary>

        public MainForm()

        {

            InitializeComponent();

 

            this.drawButton.Click += drawButton_Click;

        }

 

        #endregion

 

        //////////////////////////////////////////////////////////////////////////////////////////////////// Method

        ////////////////////////////////////////////////////////////////////////////////////////// Private

 

        #region 그리기 버튼 클릭시 처리하기 - drawButton_Click(sender, e)

 

        /// <summary>

        /// 그리기 버튼 클릭시 처리하기

        /// </summary>

        /// <param name="sender">이벤트 발생자</param>

        /// <param name="e">이벤트 인자</param>

        private void drawButton_Click(object sender, EventArgs e)

        {

            IntPtr programManagerHandle = WIN32Helper.FindWindow("Progman", null);

 

            IntPtr result = IntPtr.Zero;

 

            WIN32Helper.SendMessageTimeout

            (

                programManagerHandle,

                0x052C,

                new IntPtr(0),

                IntPtr.Zero,

                SendMessageTimeoutFlag.SMTO_NORMAL,

                1000,

                out result

            );

 

            IntPtr workerWHandle = IntPtr.Zero;

 

            WIN32Helper.EnumWindows(new WIN32Helper.EnumWindowsProc((topHandle, topParameterHandle) =>

            {

                IntPtr p = WIN32Helper.FindWindowEx

                (

                    topHandle,

                    IntPtr.Zero,

                    "SHELLDLL_DefView",

                    IntPtr.Zero

                );

 

                if(p != IntPtr.Zero)

                {

                    workerWHandle = WIN32Helper.FindWindowEx

                    (

                        IntPtr.Zero,

                        topHandle,

                        "WorkerW",

                        IntPtr.Zero

                    );

                }

 

                return true;

            }), IntPtr.Zero);

 

            IntPtr deviceContextHandle = WIN32Helper.GetDCEx(workerWHandle, IntPtr.Zero, (DeviceContextFlag)0x403);

 

            if(deviceContextHandle != IntPtr.Zero)

            {

                using(Graphics graphics = Graphics.FromHdc(deviceContextHandle))

                {

                    graphics.FillEllipse(new SolidBrush(Color.Red  ), 0  , 0  , 300, 300);

                    graphics.FillEllipse(new SolidBrush(Color.Green), 300, 300, 300, 300);

                    graphics.FillEllipse(new SolidBrush(Color.Blue ), 600, 600, 300, 300);

                }

 

                WIN32Helper.ReleaseDC(workerWHandle, deviceContextHandle);

            }

        }

 

        #endregion

    }

}

 

----------------------------------------------------------------------------------------------------

Posted by icodebroker