掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
自分でシステムメニューを出す方法 (ID:73787)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
HWND g_wnd = 0; HHOOK g_hook = 0; LRESULT CALLBACK hookProc(int code, WPARAM wParam, LPARAM lParam) { CWPSTRUCT* cwp = (CWPSTRUCT*)lParam; if (cwp->message == 0x000001E5) // メニューウィンドウに通知されるメッセージの一つ { // フックをアンインストールする ::UnhookWindowsHookEx(g_hook), g_hook = 0; // 基準となるウィンドウの座標を取得する RECT rc; ::GetWindowRect(g_wnd, &rc); // メニューウィンドウの位置を変更する ::SetWindowPos( cwp->hwnd, 0, rc.left, rc.top, 0, 0, SWP_NOZORDER | SWP_NOSIZE | SWP_NOACTIVATE); // フックチェインが無効になっているので 0 を返す return 0; } return ::CallNextHookEx(g_hook, code, wParam, lParam); } BOOL CNoCaptionDlg::PreTranslateMessage(MSG* pMsg) { if (pMsg->message == WM_SYSCHAR) { if (pMsg->wParam == _T(' ')) { TRACE("Alt+Space\n"); // フックをインストールする g_wnd = GetSafeHwnd(); g_hook = ::SetWindowsHookEx( WH_CALLWNDPROC, hookProc, 0, ::GetCurrentThreadId()); BOOL retValue = CDialog::PreTranslateMessage(pMsg); if (g_hook) { // 念のためフックをアンインストールする ::UnhookWindowsHookEx(g_hook), g_hook = 0; } return retValue; } } return CDialog::PreTranslateMessage(pMsg); } 無理矢理だけど、これでどうかな〜。 0x0313 もそうだけど、0x01E5 も非公式メッセージ。 一応 WinXP と Win7 64bit でちゃんと動作しているように見えました。 あと MFC なら AfxGetMainWnd() を使えば g_wnd は要らないかもです。
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.