ChangeWindowMessageFilter – Vista 에서 메시지(WM_COPYDATA등) 보내기

비스타에서는 UAC가 동작하고 있을때 권한이 낮은 어플리케이션에서 높은 어플리케이션으로 메시지가 전달이 안된다.

여러 사이트 검색결과 ChangeWindowMessageFilter를 이용하면 된다는 것을 알게되었다.

typedef BOOL (WINAPI *CHANGEWINDOWMESSAGEFILTER)(
  UINT message,
  DWORD dwFlag
);

를 선언부에 선언하고,

HANDLE popapi;
    CHANGEWINDOWMESSAGEFILTER ChangeWindowMessageFilter;


    popapi = LoadLibrary("USER32.DLL");
    ChangeWindowMessageFilter=(CHANGEWINDOWMESSAGEFILTER)GetProcAddress((HINSTANCE)popapi,"ChangeWindowMessageFilter");
    ChangeWindowMessageFilter(WM_COPYDATA,1);

하면 됩니다.

ChangeWindowMessageFilter에서 MSGFLT_ADD를 사용하면 해당메세지를 받아들이게 되고,
REMOVE를 사용하면 해당 메세지가 블록된다.
이렇게 하면 UAC를 멈추지 않고 각 프로그램간에 메세제를 주고 받을 수 있다.

 

* 참고

WM_DROPFILES 메시지를 받기 위해서는 아래와 같이 0x0049 메시지도 같이 등록해 줘야지 메시지가 수신됨을 확인할 수 있다.

   pChangeWindowMessageFilterFunc(0x0049, 1);

   pChangeWindowMessageFilterFunc(WM_DROPFILES, 1);

 

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 항목은 *(으)로 표시합니다