비스타에서는 UAC가 동작하고 있을때 권한이 낮은 어플리케이션에서 높은 어플리케이션으로 메시지가 전달이 안된다.
여러 사이트 검색결과 ChangeWindowMessageFilter를 이용하면 된다는 것을 알게되었다.
typedef BOOL (WINAPI *CHANGEWINDOWMESSAGEFILTER)(
UINT message,
DWORD dwFlag
);
typedef BOOL (WINAPI *CHANGEWINDOWMESSAGEFILTER)(
UINT message,
DWORD dwFlag
);
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);
HANDLE popapi;
CHANGEWINDOWMESSAGEFILTER ChangeWindowMessageFilter;
popapi = LoadLibrary("USER32.DLL");
ChangeWindowMessageFilter=(CHANGEWINDOWMESSAGEFILTER)GetProcAddress((HINSTANCE)popapi,"ChangeWindowMessageFilter");
ChangeWindowMessageFilter(WM_COPYDATA,1);
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);
pChangeWindowMessageFilterFunc(0x0049, 1);
pChangeWindowMessageFilterFunc(WM_DROPFILES, 1);
pChangeWindowMessageFilterFunc(0x0049, 1); pChangeWindowMessageFilterFunc(WM_DROPFILES, 1);