FreePascal Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
FreePacal 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
델마당
볼랜드포럼 광고 모집

FreePascal 강좌/문서
[20] 아랫분의 자료를 받은 답례로..
브리오 [egsuh] 1318 읽음    2020-12-18 11:38
저는 짧은 프로그램 하나.

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;

+ -

관련 글 리스트
20 아랫분의 자료를 받은 답례로.. 브리오 1318 2020/12/18
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.