선언:

C#

[DllImport("user32")]
public static extern IntPtr ChildWindowFromPoint(IntPtr hWndParent, POINT pt);


VB.NET

<DllImport("user32")> _
Public Shared Function ChildWindowFromPoint(hWndParent As IntPtr, pt As POINT) As IntPtr
End Function




사용 예제:

C#

using System;
using System.Runtime.InteropServices;

namespace ApiReference {
    class ApiExample {
        public struct POINT {
            public Int32 x;
            public Int32 y;
        }
        
        [DllImport("user32")]
        public static extern IntPtr WindowFromPoint(POINT pt);
        [DllImport("user32")]
        public static extern IntPtr ChildWindowFromPoint(IntPtr hWndParent, POINT pt);
        [DllImport("user32")]
        public static extern Int32 MapWindowPoints(IntPtr hWndFrom, IntPtr hWndTo, ref POINT pts, Int32 cPoints);
        
        public static void Main(string[] args) {
        EnterX:
            Console.Write("윈도우가 있는지 확인할 X 좌표를 입력하세요: ");
            Int32 x;
            try {
                x = Int32.Parse(Console.ReadLine());
            } catch (Exception) {
                Console.WriteLine("다시 입력하세요");
                goto EnterX;
            }
        EnterY:
            Console.Write("윈도우가 있는지 확인할 Y 좌표를 입력하세요: ");
            Int32 y;
            try {
                y = Int32.Parse(Console.ReadLine());
            } catch (Exception) {
                Console.WriteLine("다시 입력하세요");
                goto EnterY;
            }
            
            Console.WriteLine("{0}, {1} 에 있는 윈도우의 핸들은?", x, y);
            POINT pt;
            pt.x = x;
            pt.y = y;
            
            IntPtr hWnd = WindowFromPoint(pt);
            if ( hWnd == IntPtr.Zero ) 
                Console.WriteLine("위치에 윈도우 창이 없네요...");
            else  {
                MapWindowPoints(IntPtr.Zero, hWnd, ref pt, 1);
                IntPtr hWndChild = ChildWindowFromPoint(hWnd, pt);
                if ( hWndChild == IntPtr.Zero )
                    Console.WriteLine("{0:X8} 입니다!", hWnd.ToInt32());
                else
                    Console.WriteLine("{0:X8} 입니다!", hWndChild.ToInt32());
            }
            
            Console.ReadKey(true);
        }
    }
}


VB.NET

Imports System
Imports System.Runtime.InteropServices

Namespace ApiReference
    Class ApiExample
        Public Structure POINT
            Public x As Int32
            Public y As Int32
        End Structure

        <DllImport("user32")> _
        Public Shared Function WindowFromPoint(pt As POINT) As IntPtr
        End Function
        <DllImport("user32")> _
        Public Shared Function ChildWindowFromPoint(hWndParent As IntPtr, pt As POINT) As IntPtr
        End Function
        <DllImport("user32")> _
        Public Shared Function MapWindowPoints(hWndFrom As IntPtr, hWndTo As IntPtr, ByRef pts As POINT, cPoints As Int32) As Int32
        End Function

        Public Shared Sub Main(args As String())
            EnterX:
            Console.Write("윈도우가 있는지 확인할 X 좌표를 입력하세요: ")
            Dim x As Int32
            Try
                x = Int32.Parse(Console.ReadLine())
            Catch generatedExceptionName As Exception
                Console.WriteLine("다시 입력하세요")
                GoTo EnterX
            End Try
            EnterY:
            Console.Write("윈도우가 있는지 확인할 Y 좌표를 입력하세요: ")
            Dim y As Int32
            Try
                y = Int32.Parse(Console.ReadLine())
            Catch generatedExceptionName As Exception
                Console.WriteLine("다시 입력하세요")
                GoTo EnterY
            End Try

            Console.WriteLine("{0}, {1} 에 있는 윈도우의 핸들은?", x, y)
            Dim pt As POINT
            pt.x = x
            pt.y = y

            Dim hWnd As IntPtr = WindowFromPoint(pt)
            If hWnd = IntPtr.Zero Then
                Console.WriteLine("위치에 윈도우 창이 없네요...")
            Else
                MapWindowPoints(IntPtr.Zero, hWnd, pt, 1)
                Dim hWndChild As IntPtr = ChildWindowFromPoint(hWnd, pt)
                If hWndChild = IntPtr.Zero Then
                    Console.WriteLine("{0:X8} 입니다!", hWnd.ToInt32())
                Else
                    Console.WriteLine("{0:X8} 입니다!", hWndChild.ToInt32())
                End If
            End If

            Console.ReadKey(True)
        End Sub
    End Class
End Namespace




예제 실행 결과:




매개 변수 설명:

hWndParent - 검색할 자식 컨트롤을 포함하고 있는 부모 컨트롤의 핸들을 입력합니다.

pt - 자식 컨트롤이 있는 위치를 입력합니다.




API 설명:

부모 컨트롤 좌표계를 사용하여 자식 컨트롤의 핸들을 가져옵니다.




참고:

ChildWindowFromPoint (MSDN)




비고:

GetCursorPos API를 사용하여 얻어온 화면 좌표계로부터 자식 컨트롤의 핸들을 얻어오려는 경우엔

MapWindowPoints API를 이용하여 부모 좌표계로 변환한 후에 ChildWindowFromPoint API를 사용해야 합니다.

부모 좌표계란, 부모 컨트롤의 왼쪽 최상단이 (0, 0)을 나타내는 좌표계입니다.



'API Reference' 카테고리의 다른 글

13. GetCursorPos  (0) 2014.09.23
12. MapWindowPoints  (0) 2014.09.21
10. WindowFromPoint  (0) 2014.09.19
9. Process32First, Process32Next  (0) 2014.09.18
8. CreateToolhelp32Snapshot  (0) 2014.09.16

+ Recent posts