C ++ MessageBox (Windows.h) - что он делает и как сделать его невидимым (или эквивалентным)? - PullRequest
2 голосов
/ 09 февраля 2012

Когда у меня есть:

MessageBox(NULL, NULL , "MessageBox", NULL);

Появляется окно сообщения, и моя программа работает так, как я хочу, до тех пор, пока пользователь не нажмет кнопку «ОК» в окне сообщения, а затем программа не завершится.Я попытался вставить бесконечный цикл, чтобы получить тот же эффект, но это не работает так же, как окно сообщения.Причина, по которой я не хочу, чтобы окно сообщения было связано с тем, что оно мешает пользователю просматривать программу, и если они пытаются закрыть его, программа останавливается.Поэтому я просто хочу иметь невидимое окно сообщения или что-то с тем же эффектом.

РЕДАКТИРОВАТЬ: Чтобы уточнить, программа является прототипом для игры.Я использую хуки, чтобы найти, какие клавиши нажимает пользователь.Вот упрощенная версия программы:

#define WM_KEYDOWN                      0x0100
#define _WIN32_WINNT 0x0500

#include <iostream>
#include <windows.h>
#include <winuser.h>

using namespace std;

LRESULT CALLBACK HookProc(int nCode, WPARAM wParam, LPARAM lParam){


PKBDLLHOOKSTRUCT keypointer = (PKBDLLHOOKSTRUCT)(lParam);
if (wParam==WM_KEYDOWN){

    switch(keypointer->vkCode){


        case VK_RIGHT:
            cout << "**RIGHT**";
            goto skip;
        case VK_LEFT:
            cout << "**LEFT**";
            goto skip;
        case VK_DOWN:
            cout << "**DOWN**";
            goto skip;
        case VK_UP: 
            cout << "**UP**";
        skip:
        default:
            cout << "";
    }
}
return CallNextHookEx(NULL, nCode, wParam, lParam);
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) {


SetWindowsHookEx(WH_KEYBOARD_LL, HookProc, hInstance, 0);

MessageBox(NULL, NULL , "KLMBOX", NULL);

return 0;

}

Я просто хочу, чтобы программа имела те же функции, но без отображения окна сообщения!Я не эксперт, с которым я просто возился: http://msdn.microsoft.com/en-us/library/windows/desktop/ms632589(v=vs.85).aspx

Ответы [ 3 ]

5 голосов
/ 10 февраля 2012

Похоже, что вы ищете, это цикл сообщений . MessageBox() делает здесь две вещи: он отображает диалог, но он также предоставляет свой собственный цикл сообщений для обработки входных данных для диалога. Низкоуровневые перехватчики требуют, чтобы цикл сообщений функционировал правильно, и ваш код работает с MessageBox только потому, что цикл сообщений, который он предоставляет, выполняет необходимую обработку сообщений для вас. И именно поэтому простой бесконечный цикл не работает в качестве замены - он не обрабатывает сообщения должным образом.

Вот простой вариант, который вы можете вырезать и вставить:

MSG msg;
while(GetMessage(&msg, NULL, 0, 0))
{
    TranslateMessage(&msg);
    DispatchMessage(&msg);
}

Когда вы решаете в другом месте своего кода (но все еще в том же потоке), что хотите выйти - возможно, когда вы обнаруживаете некоторую комбинацию клавиш в хуке - используйте PostQuitMessage () ; это отправит сообщение WM_QUIT в очередь потока, а когда GetMessage получит его, он вернет 0 и цикл завершится.


Сказав все это, это не очень хороший способ написать игру; низкоуровневые клавиатурные зацепки излишни и здесь не совсем уместны. Если вы хотите получить ввод с клавиатуры в приложении Windows, самое простое - создать собственное окно, и оно будет получать сообщения WM_KEYDOWN / UP при нажатии / отпускании клавиш.

2 голосов
/ 09 февраля 2012

С вашим примером кода похоже, что вы пытаетесь создать игру, но структурируете все неправильно.В игре обычно есть главный цикл , в котором на каждой итерации вы проверяете входные данные, обновляете состояние игры и затем выполняете рендеринг.Если это именно то, что вам нужно, я бы посоветовал вам взглянуть на один из множества открытых игровых движков и попробовать некоторые учебные материалы по вводу.OGRE 3d может быть хорошим местом для начала, хорошим сообществом и хорошими учебными пособиями.

Однако, если это не то, что вы хотите, и вы действительно хотите поиграть с крючками, вам нужно будет создать другую ветку.Если вы создадите бесконечный цикл, система никогда не сможет справиться с обработкой хуков.

Вероятно, самый простой способ сделать то, что вы хотите сделать, это открыть окно и сделать его невидимым.Создание окна с использованием необработанного Win32 API, которое вы используете прямо сейчас, требует большого количества кода.Вот один учебник , в котором объясняются соответствующие шаги.

Но опять же, если вы хотите сделать простую игру, я предлагаю использовать существующий движок.Таким образом, вы будете быстрее прогрессировать.Удачи!

0 голосов
/ 09 февраля 2012

Я не понимаю ... Вы хотите окно сообщения или нет?Если нет, почему вы вызываете MessageBox ()?Я считаю, что окно сообщения является модальным, что означает, что пользователь ДОЛЖЕН подтвердить его каким-либо образом (нажав кнопку «ОК / ОТМЕНА»), прежде чем он сможет вернуться к родительскому интерфейсу.Я полагаю, что это также блокировка, что означает, что он не запускается в отдельном потоке и будет блокировать выполнение потока, к которому он был вызван, пока пользователь не закроет его.

Ваше приложение не должно закрываться только потому, чтоПользователь закрывает окно сообщения, если вы не написали его специально.Мне понадобится дополнительная информация и, возможно, примеры кода, чтобы сообщить вам, почему это происходит, если оно непреднамеренно.

...