첨부 실행 코드는 나눔고딕코딩 폰트를 사용합니다.
본 블로그는 광고를 포함하고 있습니다.
광고 클릭에서 발생하는 수익금은 모두 블로그 콘텐츠 향상을 위해 쓰여집니다.

728x90
반응형
728x170

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
    }
}

 

728x90

 

▶ 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
    }
}
728x90
반응형
그리드형
Posted by 사용자 icodebroker

댓글을 달아 주세요