선언:
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 |