2017-02-14 78 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

相关问题