using System.Text;
using static UNITTEST_WINAPI.WinAPI;
using static UNITTEST_WINAPI.WinAPI_Utils;
namespace UNITTEST_WINAPI
{
class Program
{
public static void Main()
{
const int MN_SELECTITEM = 0x01E5;
const int MN_SETHMENU = 0x01E0;
const int MN_GETHMENU = 0x01E1;
const int MN_SIZEWINDOW = 0x01E2;
const int MN_OPENHIERARCHY = 0x01E3;
const int MN_CLOSEHIERARCHY = 0x01E4;
const int MN_CANCELMENUS = 0x01E6;
const int MN_SELECTFIRSTVALIDITEM = 0x01E7;
const int MN_GETPPOPUPMENU = 0x01EA;
const int MN_FINDMENUWINDOWFROMPOINT = 0x01EB;
const int MN_SHOWPOPUPWINDOW = 0x01EC;
const int MN_BUTTONDOWN = 0x01ED;
const int MN_MOUSEMOVE = 0x01EE;
const int MN_BUTTONUP = 0x01EF;
const int MN_SETTIMERTOOPENHIERARCHY = 0x01F0;
const int MN_DBLCLK = 0x001F1;
Console.WriteLine("Start WinAPI Tester");
//IntPtr h_pro = (IntPtr)0x170E9C;
IntPtr h_pro = (IntPtr)0x000209C8;
// ContextMenu를 그리드 항목을 포함해서 클릭
PostMessage(h_pro, WindowMessage.WM_RBUTTONDOWN, 2, (IntPtr)0x540113);
PostMessage(h_pro, WindowMessage.WM_RBUTTONUP, 0, (IntPtr)0x540113);
IntPtr ctx = FindWindowWaitAsync(() => { return FindWindow("#32768", null); }, 20).GetAwaiter().GetResult();
Console.WriteLine(ctx);
SendMessage(ctx, MN_SELECTITEM, 14, 0);
SendMessage(ctx, MN_OPENHIERARCHY, 0, 0);
IntPtr ctx2 = FindWindow("#32768", null);
if (ctx == ctx2)
{
ctx2 = FindWindowEx(IntPtr.Zero, ctx, "#32768", null);
}
Console.WriteLine(ctx2);
SendMessage(ctx2, MN_SELECTITEM, 3, 0);
SendKeyToHTS_code(ctx2, 0x0D);
}
}
}
일정 프로그램에서는 KeyCode를 전달하거나 stirng을 입력하는 것에 lParams를 요구하고 있는 경우가 있다.
어떠한 Params가 입력되는지 Spy++ message 기능으로 확인 후 하드코딩하여 값을 전달하는 것이 가능하다.
간혹 SendMessage를 이용하면 그 메시지 큐가 완료되기 전에는 다음 줄의 코드로 넘어가지 않는 경우들이 발생할 수 있는데 이때는 비동기형식의 메시지 전달방식인 PostMessage를 사용한다.
- PostMessage사용 이후 해당 메시지 행위로 인해서 반영되는 결과를 기다리는 방식은 Async Await의 방식을 차용하여 필자 또한 FindWindowWaitAsync()라는 user32.dll 에서 기본적으로 제공해주는 FindWindow 함수를 활용한 핸들취득 함수를 만들어 위의 코드처럼 이용하기도 하였다.
ContextMenu를 제어하는 Message 정수로 다음의 리스트를 참고하자.
const int MN_SELECTITEM = 0x01E5;
const int MN_SETHMENU = 0x01E0;
const int MN_GETHMENU = 0x01E1;
const int MN_SIZEWINDOW = 0x01E2;
const int MN_OPENHIERARCHY = 0x01E3;
const int MN_CLOSEHIERARCHY = 0x01E4;
const int MN_CANCELMENUS = 0x01E6;
const int MN_SELECTFIRSTVALIDITEM = 0x01E7;
const int MN_GETPPOPUPMENU = 0x01EA;
const int MN_FINDMENUWINDOWFROMPOINT = 0x01EB;
const int MN_SHOWPOPUPWINDOW = 0x01EC;
const int MN_BUTTONDOWN = 0x01ED;
const int MN_MOUSEMOVE = 0x01EE;
const int MN_BUTTONUP = 0x01EF;
const int MN_SETTIMERTOOPENHIERARCHY = 0x01F0;
const int MN_DBLCLK = 0x001F1;
여기서 MN_SELECTITEM과 MN_OPENHEIERARCHY를 이용해서 하위 그륩의 PopUp형태의 ContextMenu를 PopUp할 수 있다.
'INVETSTO > Coding' 카테고리의 다른 글
섹터 분석 전략 Class (0) | 2022.04.29 |
---|---|
2-1. Strategy 클래스 설계 (0) | 2022.04.28 |
1. Form Design (0) | 2022.04.28 |
댓글