2017-02-14 91 views
2

我從我的控制檯應用程序創建消息窗口。窗口類被正確註冊並且窗口被正確創建,但是它從來沒有標題(而我的createwindow函數調用確實指定了標題)。 讓我想,可以控制檯程序創建窗口的名稱?谷歌搜索,沒有發現。 這是我的代碼,保持在最低限度:創建窗口沒有標題

using namespace std; 
hInstance = GetModuleHandle(NULL); 
WNDCLASS WndClass = {}; 
WndClass.style = CS_HREDRAW | CS_VREDRAW; // == 0x03 
WndClass.lpfnWndProc = pWndProc; 
WndClass.cbClsExtra = 0; 
WndClass.cbWndExtra = 0; 
WndClass.hIcon = 0; 
WndClass.hCursor = 0; 
WndClass.hbrBackground = (HBRUSH)COLOR_WINDOWFRAME; 
WndClass.lpszMenuName = 0; 
WndClass.lpszClassName = "EME.LauncherWnd"; 
int style = WS_OVERLAPPED | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_SYSMENU | WS_THICKFRAME | WS_CAPTION; 
if (RegisterClassA(&WndClass)) 
{ 
    cout << "class registered. Hinstance : " << hInstance << " style : (expect 0xcf0000) " << std::hex << style << endl; 
    HWND hwind2 = CreateWindowExA(0, "EME.LauncherWnd", "Mytitle", style, 0x80000000, 0x80000000, 0x80000000, 0x80000000, NULL, NULL, hInstance, NULL); 
    if (hwind2 == 0) 
     cout << "Couldn't create window" << endl; 
    else 
     cout << "created window" << endl; 
} 

輸出:

class registered. Hinstance : 00E40000 
created window 

與Nirsoft的Winlister檢查,存在窗口,有權類( 「EME.LauncherWnd」),但無名。 此外,添加這些行的代碼塊中的:

if (0 == SetWindowText(hwind2, "aTitle")) 
      cout << "couldn't set a title" << endl; 
     else 
      cout << "title set " << endl; 

輸出是

title set 

然而,窗口仍然沒有標題。如果控制檯程序不能有標題,我會假設SetWindowText調用將返回0. 我做錯了什麼? 編輯:如請求

LRESULT CALLBACK pWndProc(HWND hwnd,   // Handle to our main window 
    UINT Msg,    // Our message that needs to be processed 
    WPARAM wParam,  // Extra values of message 
    LPARAM lParam)  // Extra values of message 
{ 
     switch (Msg) 

     { 
    case WM_DESTROY: 
.... 
break; 
     } 
} 

雖然評論指出了pWndProc(我認爲哪個機構無關的窗口的結構)後添加pWndProc,原來插入這個代碼行作爲所述開關的默認案例

return DefWindowProc(hwnd, Msg, wParam, lParam); 

解決了這個問題。

+2

「*可以控制檯程序創建窗口名稱?*」 - 當然,是的。終端本身只是一個普通的Win32應用程序。控制檯應用程序可以完全訪問Win32 API。這就是說,pWndProc指的是什麼,它正確地處理窗口消息? –

+0

u nead a massage loop –

+0

投票結束,因爲缺乏可重複的例子。 –

回答

0

我發佈瞭如下評論建議的問題的答案: 答案是,要完成窗口創建,傳遞給RegisterClass WINAPI的pWndProc必須處理默認消息(特別是OS消息)。 在執行CreateWindow的過程中(調用已經啓動並返回之前),pWndProc函數已經接收到它必須處理的消息,在我的情況下它不處理它們。 這是一個標準pWndProc功能:

LRESULT CALLBACK pWndProc(HWND hwnd,   // Handle to our main window 
    UINT Msg,    // Our message that needs to be processed 
    WPARAM wParam,  // Extra values of message 
    LPARAM lParam)  // Extra values of message 
{ 
     switch (Msg) 

     { 
    case WM_DESTROY: 
... 
    default: 
     return DefWindowProc(hwnd, Msg, wParam, lParam); 
     } 
} 

源:

窗口過程通常不忽略的消息。如果它不處理消息,它必須將消息發送回系統進行默認處理。窗口過程通過調用DefWindowProc函數執行此操作,該函數執行默認操作並返回消息結果。窗口過程必須將此值作爲自己的消息結果返回。大多數窗口過程只處理幾條消息,並通過調用DefWindowProc將其他消息傳遞給系統。

+0

嗯,好奇它可以工作。通常不處理WM_NCCREATE也會結束它。那麼,消息窗口是特殊的,可能是爲什麼。你不應該設置他們的文本,因爲沒有人可以看到它,它們本來就很便宜。像Spy ++這樣的工具可以顯示類名,足夠好。 –

+0

@HansPassant雖然提示消息窗口,但他沒有傳遞'HWND_MESSAGE',所以這不是消息窗口。我想他只是希望把它放在屏幕上,並希望它沒有被注意到! –

+0

我實際上是在逆向工程中獲得樂趣和知識收益(沒有利潤)。我編寫了自己的MMORPG啓動器,其目的是在5秒內登錄並啓動遊戲,而不是使用零售啓動器啓動1分鐘。我創建我的窗口的方式與原始公司做的一樣(我在createwindow和registerclass上調試了它們的參數和函數調用),並且使用了與我無關的相同標題/類名稱。 – user

相關問題