![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
■C言語とWIN32APIで下記の様にコーテイングしています。
■MessageBox(NULL,text,"条件",MB_YESNO);
[質問-1]
・[はい][いいえ]の2個のボタンが表示されるが、当初からカーソルが[はい]ボタンの上にある様に出来ませんか?
[質問-2]
表示位置や表示サイズなどを制御出来ませんか
ウインドウの場合、下記の関数など使用して対応しました
・GetWindowRect();
・SetCursorPos();
・GetCursorPos();
・SetForegroundWindow();
.........
.........
MessageBox()の場合はどうすれば良いですか?
No.1ベストアンサー
- 回答日時:
初期ボタンはMB_DEFBUTTON1あたりのスタイルでできそうでは。
MSDN
http://msdn.microsoft.com/ja-jp/library/cc410914 …
サイズ等はフックするぐらいでしょうか?
あまりいじるのであればダイアログを自作したほうがベターかも。
参考
http://park15.wakwak.com/~opapa/cpp/Hook.htm
この回答への補足
ご教示ありがとうございます。
>初期ボタンはMB_DEFBUTTON1あたりのスタイルでできそうでは。
■私も一応ここを見たのですが・・・
・初期状態で有効なボタンを指定する事は出来るのですが
・マウスカーソルをそこに設定する方法が分かりません。
・ウィンドウ(hWnd,hButton,hCombo,hStatic....)ですと
GetWindowsRect();
SetCursorPos();
で何とか成ったのですが
MessageBox()の場合はどうすれば良いですか?
No.3
- 回答日時:
こんばんは。
MessageBox()を呼び出す前にスレッドを回して、モーダルループを通り抜け、スレッドの中からMessageBox()のハンドルを掴めば良いのでは。
MessageBox()のウィンドウクラス名が"#32770"なので、此れを利用してFindWindow()でハンドルを摘まみ出して、いじくれば目的は達成されます。
強引ですが、以下参考程度に。
DWORD WINAPI ThreadProc(LPVOID p)
{
volatile HWND hWnd = static_cast<HWND>(p);
MSG msg;
while(::PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE) == FALSE)
{
::Sleep(0);
HWND hMsgBox = ::FindWindow(TEXT("#32770"), NULL);
if(hWnd == ::GetParent(hMsgBox))
{
//MessageBoxを移動する
RECT rc;
::GetWindowRect(hMsgBox, &rc);
::MoveWindow(hMsgBox, 0, 0, rc.right - rc.left, rc.bottom - rc.top, TRUE);
//OKボタンの中央にマウスカーソルを持ってくる
HWND hButton = ::GetDlgItem(hMsgBox, IDOK);
::GetWindowRect(hButton, &rc);
::SetCursorPos(rc.left + ((rc.right - rc.left) / 2), rc.top + ((rc.bottom - rc.top) / 2));
::ExitThread(0);
}
}
return 0;
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_CLOSE:
::DestroyWindow(hwnd);
return 0;
case WM_NCDESTROY:
::PostQuitMessage(0);
return 0;
}
return ::DefWindowProc(hwnd, message, wParam, lParam);
}
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR pszArgs, int showCmd)
{
MSG msg;
WNDCLASSEX wc = {sizeof(wc)};
wc.lpszClassName = TEXT("TEST");
wc.lpfnWndProc = &::WndProc;
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW);
wc.hInstance = hInst;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
if(!::RegisterClassEx(&wc))
return 0;
HWND hWnd = ::CreateWindowEx(0, wc.lpszClassName, NULL, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInst, 0);
::ShowWindow(hWnd, SW_SHOW);
DWORD dwTID;
HANDLE hThread = ::CreateThread(NULL, 0, &::ThreadProc, hWnd, 0, &dwTID);
::MessageBox(hWnd, TEXT("test"), TEXT("test"), IDOK);
//万が一MessageBoxを発見出来なかった時に備えて、WM_QUITをポストする
::PostThreadMessage(dwTID, WM_QUIT, 0, 0);
::WaitForSingleObject(hThread, INFINITE);
::CloseHandle(hThread);
while(::GetMessage(&msg, NULL, 0, 0) == TRUE)
{
::TranslateMessage(&msg);
::DispatchMessage(&msg);
}
return msg.wParam;
}
No.2
- 回答日時:
やるとすれば MessageBoxの第一引数を表示するための(親)ウィンドウのハンドルを渡してやったほうがいいかもしれません
こうすれば 親ウィンドウの中心にMessageBoxが表示されると思います
後は MessageBox()を呼ぶ前に [はい]ボタンが来るであろう位置を計算しておいて SetCursorPosを先に実行してから MessageBox()を呼んでやるという具合になると思います
MessageBox自体が特殊なモーダルダイアログなので表示後に外部からの割り込み操作ができません
別の方法としては マウスドライバー側の設定で デフォルトボタンを追いかける機能を使うようにするとかでしょう
# ユーザーが設定を解除してしまった場合は無効になりますが ・・・
この回答への補足
ご教示すありがとうございます、
>MessageBox()を呼ぶ前に [はい]ボタンが来るであろう位置を計算しておいて SetCursorPosを先に実行してから MessageBox()を呼んでやるという具合になると思います
■上記の方法で出来ました、「関数をを呼ぶ前...」これもミソですね
■しかしMessageBox()のハンドル等はどこかで得られないものなのでしょうか、
>別の方法としては マウスドライバー側の設定で デフォルトボタンを追いかける機能を使うようにするとかでしょう
■もう少し、ヒントをください。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 動かなくなってしまった古いVBAを動くようにしたい 8 2022/09/20 13:57
- Excel(エクセル) エクセルの数式で教えてください。 2 2023/01/18 17:23
- その他(プログラミング・Web制作) pythonのグローバル変数 2 2022/11/25 18:02
- Visual Basic(VBA) VBA 参照先で選んだファイルをコピーし、出力先に別名で保存したい 8 2022/05/13 20:37
- Visual Basic(VBA) if関数とifs関数は組み合わせることはできますか。 セルA1が「A」のとき「向日葵」と表示。 セル 4 2023/02/02 20:48
- Visual Basic(VBA) ユーザーフォーム「frm_基本❶」を立ち上げると新規で入力する行数を右下のNoとして表示しています。 1 2023/03/16 19:02
- Excel(エクセル) 1から9まで表示するのに必要なボタン 1 2023/02/05 19:06
- Visual Basic(VBA) EXCEL VBAで教えてください。 1 2022/12/22 04:20
- SQL Server SQL Oracle serverにって質問です。 会社テーブルがあり、そのテーブルから 社員名、給 4 2022/05/21 12:22
- C言語・C++・C# C言語初心者 構造体 課題について 1 2023/03/10 19:30
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
JOURNALRECORD 猫パンチでノッ...
-
キャレットの現在位置の表示 (W...
-
COMPORTマルチスレッドで例外発生
-
ボタンの色(WINAPI)
-
オーバーレイみたいな処理がしたい
-
C言語についての質問です
-
「指定されたキャストは有効で...
-
Enterキーを押されたら次の処理...
-
C言語での引数の省略方法
-
信頼区間の1.96や1.65ってどこ...
-
2÷3などの余りについて
-
マイナスからプラスへ転じた時...
-
プログラムでの数字につく”f”の...
-
DWORDの実際の型は何でしょうか
-
正負を反転させて出力するプロ...
-
「Aに対するBの割合」と「Aに対...
-
#define _CRT_SECURE_NO_WARNIN...
-
ダメだ・・・分からない。while...
-
VB.net Double と...
-
Aの値からBの値を除するとは??
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
音量調節
-
return文がない場合の戻り値は...
-
C#のswitch文を簡略化したいの...
-
ゲームとかの解像度変更&全画...
-
エラー Run-Time Check Failur...
-
コンソールアプリケーションの...
-
キャレットの現在位置の表示 (W...
-
エディットボックスの背景の色...
-
COMPORTマルチスレッドで例外発生
-
ツリーコントロールの開閉アイ...
-
C言語win32api、エディットボッ...
-
Win32APIにて、ウィンドウ全体...
-
Win32APIでウィンドウを中央に...
-
エディットコントロール入力時...
-
ダイアログプログラムでEnterキ...
-
不思議な現象が起こるプログラ...
-
Win32のファイルダイアログのサ...
-
C言語のswitch case文で、scanf...
-
WM_CREATE について
-
ボタンのアイコン表示
おすすめ情報