2012-02-09 7 views
2

내가있을 때. 같은 효과를 내기 위해 무한 루프를 넣으려고했으나 메시지 상자와 같은 방식으로 작동하지 않습니다. 메시지 상자를 원하지 않는 이유는 사용자의 프로그램보기를 방해하고 프로그램을 닫으려고하면 프로그램이 중단된다는 것입니다. 그래서 기본적으로 보이지 않는 메시지 상자 나 같은 효과를 지닌 무언가를 갖고 싶습니다.C++ MessageBox (Windows.h) - 어떻게 보이지 않게 할 수 있습니까? <pre><code>MessageBox(NULL, NULL , "MessageBox", NULL); </code></pre> <p>메시지 상자가 제공</p> 나는 사용자가 메시지 상자에 괜찮 소리가 날 때까지 그것을 원하는 다음 프로그램이 종료 나의 프로그램이 작동합니다

편집 : 명확히하기 위해 프로그램은 게임의 프로토 타입입니다. 사용자가 누르는 키를 찾기 위해 후크를 사용하고 있습니다. 다음은 프로그램의 단순화 된 버전입니다 :

#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

+2

응용 프로그램을 유지하기 위해 메시지 상자가 필요하지 않으므로 어떤 종류의 응용 프로그램을 구축하고 있습니까? – Dervall

+0

마치'MsgBox's의 데이터를 출력하고 종료하는 콘솔 앱인 것 같습니다. GUI 응용 프로그램 (GUI 사용)으로 만들거나 끝에 "모든 키 누르기"프롬프트를 추가하십시오. – Deanna

+0

@Deanna 감사를 만든 편집보기 : –

답변

5

당신이 찾고있는 소리는 message loop입니다. MessageBox()이 수행하는 작업은 두 가지입니다 : 대화 상자를 표시하지만 내부적으로 자체 메시지 루프를 제공하여 대화 상자의 입력을 처리합니다. 로우 레벨 후크는 메시지 루프가 올바르게 작동하도록 요구하며 코드가 제공하는 메시지 루프가 필요한 메시지 처리를 수행하고 있기 때문에 코드가 MessageBox와 함께 작동합니다. 그래서 평범한 무한 루프가 대체물로 작동하지 않습니다. 메시지를 적절히 처리하지 못합니다.여기

간단한 당신이 잘라 내기 및 붙여 넣기 할 수 있습니다 하나 :

당신이 (하지만 여전히 같은 스레드에서) 당신이 종료 원하는 코드에서 다른 결정
MSG msg; 
while(GetMessage(&msg, NULL, 0, 0)) 
{ 
    TranslateMessage(&msg); 
    DispatchMessage(&msg); 
} 

- 아마도 당신은 어떤 키를 감지 할 때 후크 조합 - PostQuitMessage(); 이것은 스레드의 큐에 WM_QUIT 메시지를 게시하고 GetMessage가이를 검색하면 0을 반환하고 루프가 종료됩니다.


이 모든 것을 말하면, 이것은 처음부터 게임을 작성하는 좋은 방법은 아닙니다. 낮은 수준의 키보드 후크는 과잉이며 실제로는 적절하지 않습니다. 윈도우 애플리케이션에서 키보드 입력을 얻고 싶다면 가장 간단한 방법은 윈도우를 직접 생성하는 것입니다. 그리고 키를 눌렀다가 놓으면 WM_KEYDOWN/UP 메시지를 받게됩니다.

0

메시지 상자를 원하십니까? 그렇지 않다면 MessageBox()를 호출하는 이유는 무엇입니까? 나는 메시지 상자가 모달이라고 믿는다. 사용자가 부모 인터페이스로 되돌아 가기 전에 어떤 방식 으로든 그것을 승인해야한다. 나는 또한 그것이 블로킹 (blocking)하고 있다고 믿는다. 이것은 별도의 스레드에서 실행되지 않고 사용자가 닫을 때까지 호출 된 스레드의 실행을 차단한다는 것을 의미한다.

사용자가 특별히 작성한 방법이 아니라면 사용자가 메시지 상자를 닫았 기 때문에 응용 프로그램을 종료하면 안됩니다. 더 많은 정보가 필요하고 코드 샘플이 필요하지 않은 이유는 그것이 의도하지 않은 경우 어떻게되는지 알려주는 것입니다.

+0

감사를 만든 편집을 참조하십시오. –

+0

아, 메시지 상자를 표시 한 후에 더 이상 지시 사항이 없으므로 메시지 상자가 닫힌 후 프로그램이 종료됩니다. 응용 프로그램을 계속 실행하려면 끝이 나는 무언가가 발생할 때까지 끝내지 못하게하십시오. 일반적인 방법은 중단 조건이있는 무한 루프를 사용하는 것입니다. 무한 루프를 만드는 가장 좋은 방법은 while (1) {}을 사용하는 것입니다. 프로그램을 끝내기 위해 break 명령을 사용하여 무한 while 루프를 빠져 나가기를 원할 때 ... 루프 안에서 물건을하고 있는지 확인하거나 프로그램이 멈추는 것처럼 보일뿐입니다. – CHollman82

2

코드 샘플을 사용하면 게임을 만들려고하지만 모든 구성이 잘못된 것처럼 보입니다. 게임은 일반적으로 메인 루프을 가지고 있습니다. 각 반복마다 입력을 확인하고 게임 상태를 업데이트 한 다음 렌더링합니다. 이것이 당신이 원하는 것이라면, 거기에있는 많은 공개 게임 엔진 중 하나를 살펴보고 입력 자습서 중 일부를 시도해 보시기 바랍니다. OGRE 3d는 좋은 커뮤니티, 훌륭한 커뮤니티 및 좋은 자습서입니다.

그러나 원하는 것이 아니며 실제로 후크로 놀고 싶다면 다른 스레드를 만들어야합니다. 무한 루프를 만들면 시스템은 결코 후크를 처리 할 수 ​​없습니다.

아마 당신이하고 싶은 일을하는 가장 쉬운 방법은 창을 열고 보이지 않게 만드는 것입니다. 지금 사용하고있는 원시 Win32 API를 사용하여 창을 만드는 것은 꽤 많은 코드를 필요로합니다. 여기에는 관련된 단계를 설명하는 tutorial이 있습니다.

그러나 간단한 게임을 만들려는 경우 기존 엔진을 활용하는 것이 좋습니다. 그렇게 빨리 진행할 것입니다. 행운을 빕니다!