2009-10-07 12 views
9

私はMessageBox(または同様のもの)を使ってメッセージをプリントアウトしたいと思います。また、画面上のどこにボックスが表示されているかを制御することもできますが、場所を制御できるMessageBoxの説明には何も見つかりません。私は何か見落としてますか? MessageBoxを使用できない場合は、代替手段がありますか?MessageBoxの場所を設定しますか?

ここに入るのはあまりにも複雑な理由から、私は自分のウィンドウを作ったり、コールバック関数のアドレスを渡したりすることはしませんでした。

答えて

12

ステップ1:トラップにメッセージボックスの作成をCBTフックを作成します。

// global hook procedure 
HHOOK hhookCBTProc = 0; 

LRESULT CALLBACK pfnCBTMsgBoxHook(int nCode, WPARAM wParam, LPARAM lParam) 
{ 
    if (nCode == HCBT_CREATEWND) 
    { 
    CREATESTRUCT *pcs = ((CBT_CREATEWND *)lParam)->lpcs; 

    if ((pcs->style & WS_DLGFRAME) || (pcs->style & WS_POPUP)) 
    { 
     HWND hwnd = (HWND)wParam; 

     // At this point you have the hwnd of the newly created 
     // message box that so you can position it at will 
     SetWindowPos(hwnd, ...); 
    } 
    } 

    return (CallNextHookEx(hhookCBTProc, nCode, wParam, lParam)); 
} 

ステップ2:前とメッセージボックスを表示した後、フックを取り外し/取り付け:

// set hook to center the message box that follows 
hhookCBTProc = SetWindowsHookEx(WH_CBT, 
           pfnCBTMsgBoxHook, 
           0, GetCurrentThreadId()); 

int sResult = MessageBox(hwndParent, pszMsg, pszTitle, usStyle); 

// remove the hook 
UnhookWindowsHookEx(hhookCBTProc); 
4

メッセージボックスに追加の動作が必要な場合、私はいつも自分のウィンドウを作成し、標準のMessageBoxのように見せました。あなたは一度それを行うだけで、いつでも他のプロジェクトでそれを再利用することができます。

1

これはCBTフック手順で実行できます。 VBでこれを行う方法についてはMSDNの記事がありますが、それをC++に変換するのは難しくありません。

http://support.microsoft.com/kb/180936

3

メッセージボックスは、デフォルトの基本セットです。それらが好きではありませんか?あなた自身を持って来てください。すべての複雑さを備えた実際のウィンドウを必要としないが、MessageBoxがあまりにも制限されている場合は、ダイアログを作成します。

関連する問題