안녕하세요.
dll로 키보드 전역훅을 걸고 자신을 호출한 어플에 WM_COPYDATA를
이용하여 특정값들을 보내주는 루틴을 만들고 있습니다.
어떤 어플이 dll을 호출할 지 모르기 때문에 dll 내부의 훅 프로시져에
호출하는 어플의 핸들값을 넣어서 보내구요. dll 에서 SendMessage할때
이값을 참조하여 메세지를 보냈는데 어플에 메세지가 안오네요..ㅜㅜ
dll에서 자신을 호출한 어플을 알거나 아니면 함수만들어서라도 자신의
핸들값을 넣어줄수는 없나요?
dll의 훅 프로시져에 다음과 같이 넣었구요.
...
var Hnd: THandle;
...
function SetKbHook(hd: THandle): Boolean;
begin
Hnd:= Hd;
KbHook := SetWindowsHookEx(WH_KEYBOARD, KbHookProc, HInstance, 0);
Result := Boolean(KbHook);
end;
...
function KbHookProc(Code: Integer; wParam: WPARAM; lParam: LPARAM): LongInt; stdcall;
var
cd: TCOPYDATASTRUCT;
h: THookInfo;
begin
if Code >= 0 then begin
if (( LParam shr 16) and KF_UP) <> 0 then begin
cd.dwData := $01;
cd.cbData := sizeof(THookInfo);
cd.lpData := @Soo;
h.MSKey := TRUE;
h.MCKey := TRUE;
h.MAKey := TRUE;
h.MCode := wParam;
h.MCursor:= getcursor;
SendMessage(Hnd, WM_COPYDATA, 0, LongInt(@cd));
end;
end;
이렇게 했는데 안날아 오네요..
Hnd대신에 FindWindow함수 써서 특별한 윈도우 찾아서 메세지 보내면
정확하게 날아 옵니다. 무엇이 문제일까요?
오늘도 즐거운 하루 되세요.