Vista 対応
いまさらながら、Vista の UAC 対応について調べた。
一般 or 保護モードで起動されたプロセスからの、管理者モード で起動されたプロセスへの PostMessage() は失敗するのだね。
今まで、当然のように UAC は解除してたので気付いてなかったです^^;
VD では、ウィンドウをドラッグする瞬間に、そのドラッグされたウィンドウを subclass 化してそのウィンドウの情報を取得しているのだが、その情報を PostMesssage() で VD に伝えてるので、UAC Enable だと届かず、謎な状態でした^^;
で、ちょっとぐぐったら、ChangeWindowMessageFilter() で、PostMessage() できるメッセージを登録できるとのこと。
で、試したら、一発でいまくいきました!
Vista 以外だと、この API は無いかもしれないので、LoadLibrary() して
typedef BOOL (__stdcall *FUNC_BOOL_UINT_DWORD)(UINT, DWORD);
void ChangeWindowMessageFilterForVista(void)
{
FUNC_BOOL_UINT_DWORD ChangeWindowMessageFilter;
HMODULE hDll = LoadLibrary("user32.dll");
if (hDll) {
ChangeWindowMessageFilter = (FUNC_BOOL_UINT_DWORD) GetProcAddress(hDll, "ChangeWindowMessageFilter");
if (ChangeWindowMessageFilter) {
ChangeWindowMessageFilter(WM_USER_DRAGGING_CAPTION, MSGFLT_ADD);
ChangeWindowMessageFilter(WM_USER_FINISH_DRAGGING_CAPTION, MSGFLT_ADD);
}
FreeLibrary(hDll);
}
}
こんな感じでうまくいきました。管理者権限、難しいね。。。
#WM_USER(= 0x0400) 以上のメッセージじゃないと ADD できないっぽいね。
明日、会社でXPでも試してみよう。(XP は持ってないの。。。)
| 固定リンク
この記事へのコメントは終了しました。
コメント