첨부 실행 코드는 나눔고딕코딩 폰트를 사용합니다.
유용한 소스 코드가 있으면 icodebroker@naver.com으로 보내주시면 감사합니다.
블로그 자료는 자유롭게 사용하세요.

728x90
반응형

TestProject.zip
다운로드

▶ DesktopWindowsHelper.cs

using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Text;

namespace TestProject
{
    /// <summary>
    /// 데스크톱 윈도우 헬퍼
    /// </summary>
    public static class DesktopWindowsHelper
    {
        //////////////////////////////////////////////////////////////////////////////////////////////////// Delegate
        ////////////////////////////////////////////////////////////////////////////////////////// Private

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

        /// <summary>
        /// 윈도우 열거하기 프로시저
        /// </summary>
        /// <param name="windowHandle">윈도우 핸들</param>
        /// <param name="longParameter">LONG 매개 변수</param>
        /// <returns>처리 결과</returns>
        private delegate bool EnumWindowsProc(IntPtr windowHandle, int longParameter);

        #endregion

        //////////////////////////////////////////////////////////////////////////////////////////////////// Import
        ////////////////////////////////////////////////////////////////////////////////////////// Static
        //////////////////////////////////////////////////////////////////////////////// Private

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

        /// <summary>
        /// 윈도우 표시 여부 구하기
        /// </summary>
        /// <param name="windowHandle">윈도우 핸들</param>
        /// <returns>윈도우 표시 여부</returns>
        [DllImport("user32.dll")]
        [return: MarshalAs(UnmanagedType.Bool)]
        private static extern bool IsWindowVisible(IntPtr windowHandle);

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

        /// <summary>
        /// 윈도우 텍스트 구하기
        /// </summary>
        /// <param name="windowHandle">윈도우 핸들</param>
        /// <param name="windowTextStringBuilder">윈도우 텍스트 문자열 빌더</param>
        /// <param name="maximumCount">최대 카운트</param>
        /// <returns>처리 결과</returns>
        [DllImport("user32.dll", EntryPoint = "GetWindowText", ExactSpelling = false, CharSet = CharSet.Auto, SetLastError = true)]
        private static extern int GetWindowText(IntPtr windowHandle, StringBuilder windowTextStringBuilder, int maximumCount);

        #endregion
        #region 데스크톱 윈도우 열거하기 - EnumDesktopWindows(desktopHandle, enumerateWindowsProcedure, longParameter)

        /// <summary>
        /// 데스크톱 윈도우 열거하기
        /// </summary>
        /// <param name="desktopHandle">데스크톱 핸들</param>
        /// <param name="enumerateWindowsProcedure">윈도우 나열하기 프로시저</param>
        /// <param name="longParameter">LONG 매개 변수</param>
        /// <returns>처리 결과</returns>
        [DllImport("user32.dll", EntryPoint = "EnumDesktopWindows",
        ExactSpelling = false, CharSet = CharSet.Auto, SetLastError = true)]
        private static extern bool EnumDesktopWindows(IntPtr desktopHandle, EnumWindowsProc enumerateWindowsProcedure, IntPtr longParameter);

        #endregion

        //////////////////////////////////////////////////////////////////////////////////////////////////// Field
        ////////////////////////////////////////////////////////////////////////////////////////// Static
        //////////////////////////////////////////////////////////////////////////////// Private

        #region Field

        /// <summary>
        /// 윈도우 핸들 리스트
        /// </summary>
        private static List<IntPtr> _windowHandleList;

        /// <summary>
        /// 윈도우 제목 리스트
        /// </summary>
        private static List<string> _windowTitleList;

        #endregion

        //////////////////////////////////////////////////////////////////////////////////////////////////// Method
        ////////////////////////////////////////////////////////////////////////////////////////// Static
        //////////////////////////////////////////////////////////////////////////////// Public

        #region 데스크톱 윈도우 핸들 리스트 설정하기 - SetDesktopWindowHandleList(windowHandleList, windowTitleList)

        /// <summary>
        /// 데스크톱 윈도우 핸들 리스트 설정하기
        /// </summary>
        /// <param name="windowHandleList">윈도우 핸들 리스트</param>
        /// <param name="windowTitleList">윈도우 제목 리스트</param>
        public static void SetDesktopWindowHandleList(out List<IntPtr> windowHandleList, out List<string> windowTitleList)
        {
            _windowHandleList = new List<IntPtr>();
            _windowTitleList  = new List<string>();

            if(!EnumDesktopWindows(IntPtr.Zero, enumWindowProc, IntPtr.Zero))
            {
                windowHandleList = null;
                windowTitleList  = null;
            }
            else
            {
                windowHandleList = _windowHandleList;
                windowTitleList  = _windowTitleList;
            }
        }

        #endregion

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

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

        /// <summary>
        /// 윈도우 열거하기 프로시저
        /// </summary>
        /// <param name="windowHandle">윈도우 핸들</param>
        /// <param name="longParameter">LONG 매개 변수</param>
        /// <returns>처리 결과</returns>
        private static bool enumWindowProc(IntPtr windowHandle, int longParameter)
        {
            StringBuilder stringBuilder = new StringBuilder(1024);

            int length = GetWindowText(windowHandle, stringBuilder, stringBuilder.Capacity);

            string title = stringBuilder.ToString().Replace("", "");

            if(IsWindowVisible(windowHandle) && !string.IsNullOrWhiteSpace(title))
            {
                _windowHandleList.Add(windowHandle);

                _windowTitleList.Add(title);
            }

            return true;
        }

        #endregion
    }
}

 

▶ MainForm.cs

using System;
using System.Collections.Generic;
using System.Windows.Forms;

namespace TestProject
{
    /// <summary>
    /// 메인 폼
    /// </summary>
    public partial class MainForm : Form
    {
        //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor
        ////////////////////////////////////////////////////////////////////////////////////////// Public

        #region 생성자 - MainForm()

        /// <summary>
        /// 생성자
        /// </summary>
        public MainForm()
        {
            InitializeComponent();

            #region 이벤트를 설정한다.

            Load                    += Form_Load;
            this.searchButton.Click += searchButton_Click;

            #endregion
        }

        #endregion

        //////////////////////////////////////////////////////////////////////////////////////////////////// Method
        ////////////////////////////////////////////////////////////////////////////////////////// Private
        //////////////////////////////////////////////////////////////////////////////// Event

        #region 폼 로드시 처리하기 - Form_Load(sender, e)

        /// <summary>
        /// 폼 로드시 처리하기
        /// </summary>
        /// <param name="sender">이벤트 발생자</param>
        /// <param name="e">이벤트 인자</param>
        private void Form_Load(object sender, EventArgs e)
        {
            SetListBoxData();
        }

        #endregion
        #region 조회 버튼 클릭시 처리하기 - searchButton_Click(sender, e)

        /// <summary>
        /// 조회 버튼 클릭시 처리하기
        /// </summary>
        /// <param name="sender">이벤트 발생자</param>
        /// <param name="e">이벤트 인자</param>
        private void searchButton_Click(object sender, EventArgs e)
        {
            SetListBoxData();
        }

        #endregion

        //////////////////////////////////////////////////////////////////////////////// Functin

        #region 리스트 박스 데이터 설정하기 - SetListBoxData()

        /// <summary>
        /// 리스트 박스 데이터 설정하기
        /// </summary>
        private void SetListBoxData()
        {
            List<IntPtr> windowHandleList;
            List<string> windowTitleList;

            DesktopWindowsHelper.SetDesktopWindowHandleList(out windowHandleList, out windowTitleList);

            this.listBox.DataSource = windowTitleList;
        }

        #endregion
    }
}
728x90
반응형
Posted by 사용자 icodebroker
TAG , ,

댓글을 달아 주세요