저는 짧은 프로그램 하나.
KakaoTalk PC 버전으로 대화창을 PC에 실행하는 도중, 프로그램에서 대화창에 직접 내용을 입력하는 방법입니다.
프로그램 내에서 Windows API 를 호출하는 방식인데, 보시다시피 Windows unit 안에 대부분(전부?는 아니겠죠?)의
Windows API함수들이 Pascal 로 재정의되어 있습니다. 원래는 주로 system32.dll 에 정의된 function/procedure 로
생각됩니다. Library에서 external로 정의해서 불러옵니다.
function FindWindow(lpClassName:LPCSTR; lpWindowName:LPCSTR):HWND; external 'user32' name 'FindWindowA';
function FindWindowEx(_para1:HWND; _para2:HWND; _para3:LPCSTR; _para4:LPCSTR):HWND; external 'user32' name 'FindWindowExA';
function GetClassName(hWnd:HWND; lpClassName:LPSTR; nMaxCount:longint):longint; external 'user32' name 'GetClassNameA';
그래서.... 다음과 같이 Windows API를 사용하는 procedure를 간단하게 작성할 수 있습니다.
Parameter 에서, "xSendTo" 는 카카오톡이다보니 SendTo이고, 의미는 윈도 창의 제목을 말합니다. 윈도를 띄우면 맨 상단에 현재 창의 Title 이 보이는데, FindWindow 함수가 그걸 이용해서 그 창을 찾아냅니다.
카카오톡의 경우 대화상대 이름이 창이름이 되니까 대화창의 제목을 그대로 씁니다.
카카오톡 대화창 내에서 내용을 입력하는 부분은 아마 RichEdit50W 란 이름을 갖고 있나 봅니다.
그 대화창으로 커서가 찾아갑니다.
xMessage 는 메시지 내용입니다.
대화창을 찾았으면, SendMessage, PostMessage 함수를 불러서 실제로 입력한 것과 같은 효과를 냅니다.
WM_SETTEXT 등은 모두 constant로, Lazarus 에서 (아마도 Windows unit 내에서) 이미 정의되어 있기 때문에 그냥 쓰시면 됩니다. SendMessage 의 맨 오른쪽, LParam(Message) 에만 주목하시면, 나머지는 이해하는 데 별 어려움이 없을 듯 합니다.
Windows API까지 건드리는 프로그래밍은 웬만하면 하고 싶지 않지만, 이제는 무서워서 도망부터 갈 필요는 없을 듯합니다. 아래 프로그램도 어느 분이 엑셀에서 사용할 수 있게 VBA로 작성한 것을 Pascal로 옮겨 보았습니다. 처음에는 pascal type string을 PChar 형식으로 바꾸고 하는 게 겁이 났는데, 대체로 다 알아서 처리해 준다..고 생각하고 접근하니 되는군요.
uses ... Windows;
......
procedure SendKakao(xSendTo, xMessage:string);
var
hwnd_KakaoTalk: longint;
hwnd_RichEdit: longint;
SendTo,
Message : PChar;
begin
SendTo:= PChar(xSendTo);
Message:= PChar(xMessage);
hwnd_KakaoTalk := FindWindow(nil, SendTo);
hwnd_RichEdit := FindWindowEx(hwnd_KakaoTalk, 0, 'RichEdit50W', nil);
If hwnd_RichEdit = 0
then ShowMessageFmt('KakaoTalk chat titled %s not found', [xSendTo])
else begin
SendMessage(hwnd_RichEdit, WM_SETTEXT, 0, LParam(Message));
PostMessage(hwnd_RichEdit, WM_KEYDOWN, VK_RETURN, 0);
end;
end;