제가 하고 싶은 작업은, 특정키를 눌렀을때, 완벽하게 다른 키가 눌린것 처럼 윈도우와 여타 어플리캐이션을 속이는 일입니다. 그것도 제 프로그램이 훅한 이후에 다른 프로그램이 훅한것은 포기하고, 기존에 실행된 프로그램들만 속이는겁니다.
우선 민성기님의 키보드 훅킹 강좌를 참고하여 전연훅에는 성공했습니다.
그러나 CallNextHookEx를 부르지 않으면 키가 안 먹는것은 되지만,
내가 원하는 변경은 불가능하고, 'a'키를 누르면 'd'가 눌린것 처럼 아무리 하려해도 안 먹히고 그냥 'a'가 찍히고 있습니다. 어떻게 하면 'd'가 눌린것처럼 속일 수 있을까요?
아래는 hook 함수입니다. 제가 무엇을 잘못한것일까요??
function MyKBHook(Code : Integer; wParam : WPARAM; lParam : LPARAM)
: LongInt; stdcall;
begin
{ 파일에 저장된 훅핸들을 읽어온다. }
if HKbHook = 0 then begin
ReadData;
end;
{ Code값이 0보다 크거나 같을때만 }
{ 갈구리질을 하는 것이 요령. }
if Code >= 0 then begin
case wParam of
65 : begin
wParam := 68; // A를 D로
lParam := lParam and $10000000; // 스캔코드도 바꿔줘야 한다.
lParam := lParam or $01200001; // 최상위는 4bit는 눌림/계속눌림/뗌 표시
end;
end;
end;
Result := CallNextHookEx(HKbHook, Code, myW, myL);
end;
혹시나 해서 위 소스의 if 문 안에 다른것 다 지우고,
wParam := 68; // A를 D로
lParam := lParam and $10000000; // 스캔코드도 바꿔줘야 한다.
lParam := lParam or $01200001; // 최상위는 4bit는 눌림/계속눌림/뗌 표시
요렇게만 남겨서 모든 키 눌림을 D로 바꿔보려 했으나,
키를 속이는건 불가능 합니다.
어떻게 해야 속일 수 있을까요?
감사합니다.
아마도 이렇게
Result := CallNextHookEx(HKbHook, Code, myW, myL);
case 문을 수행한후 항상 훅체인이 다음으로 넘어가서 그럴겁니다.
case 의 else 문에 위 문장이 들어가도록 한다면
원하시는 대로 동작할거 같네요..
즐거운 프로그래밍 하시길~