다른 프로세스의 주소 공간에서 코드를 그냥 실행하는 것은 참 쉽다. CreateRemoteThread, SetWindowsHookEx 등등..

하지만 CreateRemoteThread 는 메인 스레드(여기서는 메시지 루프가 있는 스레드)가 아닌 다른 스레드에서 실행되고, SetWindowsHookEx 는 언제 어떻게 몇번 불릴지 모른다..

그래서 내가 GUI 앱의 메인 스레드에 1회성 코드를 실행할 때 사용하는 방법은 SetTimer 를 이용하는 방법이다. SetTimer 의 마지막 인자를 보면 lpTimerFunc 콜백 인자가 있고 이 콜백은 메시지 루프에서 호출된다.

SetTimer 의 첫 번째 인자에 hWnd에 다른 프로세스의 창을 넣으면 작동하지 않기 때문에, CreateRemoteThread 등지로 해당 프로세스의 주소 공간에서 SetTimer 를 실행하고, 콜백 인자에 원하는 함수 주소를 넣으면 원하는 결과를 볼 수 있다.