我试图创建一个简单的窗口与C/C++使用本机Windows消息队列系统(没有。我按照MSDN教程编写了一些创建空窗口的基本代码:
void main()
{
HINSTANCE hinst;
HWND hwndMain;
WNDCLASSEX wnd;
MSG msg;
hinst = GetModuleHandle( NULL );
memset( &wnd, 0, sizeof( wnd ) );
wnd.cbSize = sizeof( wnd );
wnd.lpszClassName = "MainWClass";
wnd.lpfnWndProc = MainWProc;
wnd.hInstance = hinst;
int result = RegisterClassEx( &wnd );
if( !result )
{
printf("RegisterClassEx error: %d\r\n", GetLastError() );
}
hwndMain = CreateWindowEx
(
0, //extended styles
wnd.lpszClassName, //class name
"Main Window", //window name
WS_OVERLAPPEDWINDOW | WS_HSCROLL | WS_VSCROLL | WS_MINIMIZEBOX, //style tags
CW_USEDEFAULT, //horizontal position
CW_USEDEFAULT, //vertical position
CW_USEDEFAULT, //width
CW_USEDEFAULT, //height
(HWND) NULL, //parent window
(HMENU) NULL, //class menu
(HINSTANCE) wnd.hInstance, //some HINSTANCE pointer
NULL //Create Window Data?
);
if( !hwndMain )
{
printf("Oh shi- %d\n", GetLastError() );
}
ShowWindow( hwndMain, SW_SHOWDEFAULT );
UpdateWindow( hwndMain );
}
当我运行/调试程序时,CreateWindowEx返回0,这意味着它失败了。这将触发错误消息“Oh shi- [error code]”。最令人困惑的部分是错误消息打印到控制台:
哦施-0
GetLastError()返回的错误码为0,即ERROR_SUCCESS!
我完全不知所措发生什么事了?我很困惑。..
P.S.我在Windows 7 32位上使用Visual C++ Express 2010。我在其他地方写了一个Windows过程,但它只是在所有情况下返回0。如果有人想看,我很乐意展示。
我已将Visual C++项目的项目默认字符集更改为“未设置”。我不需要在我的东西前面加上L。
编辑:添加wnd。return hint;
编辑:删除不必要的(WNDPROC)转换
编辑:为RegisterClassEx添加了错误检查
原来问题出在Visual C++ Express上(或者至少不是代码本身)。我把代码复制到另一个项目,它工作了。
5条答案
按热度按时间6qfn3psc1#
我们看不出你需要使用演员阵容的真实的原因,但这很可疑。如果Windows没有看到任何错误,则从GetLastError()返回0。如果窗口程序被破坏就会发生这种情况。就像这个:
Windows发送WM_NCCREATE消息以请求创建窗口。如果该消息没有得到处理,那么将没有窗口。没有错误。修复:
根据需要调整以自定义窗口。只要确保为您不想自己处理的每条消息调用DefWindowProc()即可。并保持佩佐德近在咫尺,以避免简单的错误。丢掉石膏。
zbq4xfa02#
所有现代版本的Windows都在内部使用Unicode,默认情况下,Visual Studio项目#定义
_UNICODE
/UNICODE
,这会使应用程序链接到Windows标头的Unicode版本。但是,当您将应用程序编译为Unicode时,字符(以及“字符串”)类型是不同的。而不是
char
,它们现在是wchar_t
。这意味着你必须显式地将字符串字面量声明为长字符串,方法是在它们前面加上L
。或者,Windows标头将所有这些隐藏在宏后面,但这不再是必要的,因为Windows已经使用Unicode很长时间了,而且不太可能改变。
除此之外,在初始化
WNDCLASSEX
结构时还缺少一些东西,比如hInstance
成员。这些东西都必须设置得很完美,否则就会失败。同样,RegisterClass(Ex)
和CreateWindow(Ex)
函数必须传递与窗口类名称对应的 * 完全相同的字符串 * 值,否则它们会认为您在谈论两件不同的事情。错别字是不能原谅的!我强烈建议您使用Visual Studio向导创建一个空白的(但工作!)项目模板。
正确的样板代码如下所示:
uqcuzwp83#
我也有这个问题。尝试初始化窗口类的所有成员\属性。换句话说,设置其余成员。比如说;
只要将类名更改为您想要的任何名称即可。
希望这能帮上忙。
eeq64g8w4#
我也有同样的问题。
在我的情况下,它只是我使用的视觉sutdio没有管理员权限。我发现在这种情况下我不能调试我的应用程序。在没有管理员权限的调试模式下,CreateWindowEx返回null,错误代码结果为0,就像您一样。但是如果你转到你的构建目录,你就可以使用你的应用程序(不是在调试模式下)。因此,如果这对你来说也是如此,只需启动管理员权限的visula工作室并完成。
我认为几乎有一种方法可以使用visual studio调试模式与管理员的权利,而无需启动visual studido与管理员密码每一次。我不知道该怎么做,但我认为这是可能的。
j8ag8udp5#
在我的情况下,我必须手动处理WNC_NCCREATE。DefWindowProc为WNC_NCCREATE返回零,我使用以下命令修复了该问题: