다른 프로그램에 있는 컨트롤의 텍스트를 읽으려면
WM_GETTEXT 메시지를 사용합니다.
그런데 Button, Label 등 간단한 컨트롤의 텍스트는 잘 읽어지지만
조금 복잡한 컨트롤 들은 컨트롤에 맞게 메시지를 사용하더라도
텍스트를 읽어 올 수 없습니다.
예로, A 프로그램에서 B 프로그램에 있는 리스트뷰 컨트롤을 읽기 위해
LVM_GETITEM 메시지를 사용할 때 lParam에 LV_ITEM구조체의 포인터를
넘겨 주어야 합니다. 그런데 B 프로세스가 메시지를 처리할 때
A 프로세스에 있는 LV_ITEM 구조체 포인터를 인식할 수 없으므로
메시지를 처리할 수 없게 됩니다. 그래서 다른 프로그램에 구조체 포인터를
보내는 메시지는 항상 실패합니다.
해결 방법은, LV_ITEM 구조체 메모리를 B 프로세스에 할당하고 메시지에
이 메모리 포인터를 보냅니다.(같은 프로세스의 메모리이므로 메시지는
성공적으로 처리됩니다.) 이 메모리를 프로세스간 메모리 복사함수를 이용하여
A 프로세스로 복사해 오면 됩니다.
(자료실에 올린 [다른 프로그램의 ListView 컨트롤 읽는 프로그램] 참고)
이 방법을 이용하면 한컴사전처럼 마우스 포인터 위치의 텍스트를 읽어오는
프로그램을 만들 수 있습니다. 문제는 텍스트를 읽는 메시지를 알 수 있느냐인데
윈도우 표준 컨트롤(또는 표준 컨트롤을 기반으로 만든 컨트롤)은 메시지와
구조체가 공개되어 있으므로 각 컨트롤에 맞게 코딩해 주면 됩니다.
WM_GETTEXT 메시지를 사용합니다.
그런데 Button, Label 등 간단한 컨트롤의 텍스트는 잘 읽어지지만
조금 복잡한 컨트롤 들은 컨트롤에 맞게 메시지를 사용하더라도
텍스트를 읽어 올 수 없습니다.
예로, A 프로그램에서 B 프로그램에 있는 리스트뷰 컨트롤을 읽기 위해
LVM_GETITEM 메시지를 사용할 때 lParam에 LV_ITEM구조체의 포인터를
넘겨 주어야 합니다. 그런데 B 프로세스가 메시지를 처리할 때
A 프로세스에 있는 LV_ITEM 구조체 포인터를 인식할 수 없으므로
메시지를 처리할 수 없게 됩니다. 그래서 다른 프로그램에 구조체 포인터를
보내는 메시지는 항상 실패합니다.
해결 방법은, LV_ITEM 구조체 메모리를 B 프로세스에 할당하고 메시지에
이 메모리 포인터를 보냅니다.(같은 프로세스의 메모리이므로 메시지는
성공적으로 처리됩니다.) 이 메모리를 프로세스간 메모리 복사함수를 이용하여
A 프로세스로 복사해 오면 됩니다.
(자료실에 올린 [다른 프로그램의 ListView 컨트롤 읽는 프로그램] 참고)
이 방법을 이용하면 한컴사전처럼 마우스 포인터 위치의 텍스트를 읽어오는
프로그램을 만들 수 있습니다. 문제는 텍스트를 읽는 메시지를 알 수 있느냐인데
윈도우 표준 컨트롤(또는 표준 컨트롤을 기반으로 만든 컨트롤)은 메시지와
구조체가 공개되어 있으므로 각 컨트롤에 맞게 코딩해 주면 됩니다.
공개되지 않은 새로운 컨트롤은 여전히 읽을 방법이 없겠죠 -.-;;;