首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >来自CreateWindowEx()的ERROR_INVALID_WINDOW_HANDLE

来自CreateWindowEx()的ERROR_INVALID_WINDOW_HANDLE
EN

Stack Overflow用户
提问于 2012-03-19 22:44:51
回答 2查看 3.6K关注 0票数 4

当CreateWindowEx()在我的程序中失败时,我得到了错误ERROR_INVALID_WINDOW_HANDLE。我正在使用带有本机Win32应用程序接口的C++。

我不知道为什么,我也尝试过在CreateWindowEx中使用一些参数,但每次都会产生完全相同的错误。

当然,我也尝试过将W添加到随机函数和数据类型中,希望UNICODE版本以某种方式改变works...nothing。

这是调用CreateWindowEx()的函数:

代码语言:javascript
复制
int InitMainWindow( HWND *hwnd, WNDCLASSEXW *wnd, WNDPROC wndproc )
{
    memset( wnd, NULL, sizeof( WNDCLASSEXW ) );
    wnd->cbSize = sizeof( WNDCLASSEXW );
    wnd->lpszClassName = L"MainWClass";
    wnd->lpfnWndProc = wndproc;
    wnd->hInstance = GetModuleHandle( NULL );

    if( NULL == RegisterClassExW(wnd) )
    {
        printf( "InitMainWindow::RegisterClassexW() error: %d\r\n", GetLastError() );
        return GetLastError();
    }

    *hwnd = CreateWindowExW
        (
        WS_EX_ACCEPTFILES | WS_EX_APPWINDOW, //extended styles
        wnd->lpszClassName, //class name
        L"MainWindow", //window name
        WS_OVERLAPPEDWINDOW | WS_VISIBLE, //style tags
        CW_USEDEFAULT, //horizontal position
        CW_USEDEFAULT, //vertical position
        900, //width
        600, //height
        GetDesktopWindow(), //parent window
        NULL, //class menu
        GetModuleHandle(NULL), //some HINSTANCE pointer
        NULL //Create Window Data?
        );

    if( NULL == *hwnd )
    {
        printf( "InitMainWindow::CreateWindowEx() error: %d\r\n", GetLastError() );
        return GetLastError();
    }

    return 0;
}

这是主要的方法:

代码语言:javascript
复制
static HWND mainhwnd;
void main()
{
    DWORD time;
    time = GetTickCount();

    MSG msg;
    WNDCLASSEXW wnd = { 0 };
    NOTIFYICONDATA nid;

    InitMainWindow( &mainhwnd, &wnd, MainWndProc );
    InitNotifyIcon( &mainhwnd, &nid );
    ShowWindow( mainhwnd, true );
    UpdateWindow( mainhwnd );

    time = ( GetTickCount() - time );
    std::cout << "Time: " << time << "\r\n" << std::endl;

    for( ; ; ) //message loop
    {
        while( GetMessage( &msg, NULL, 0, 0 ) )
        {
            if( WM_CLOSE == msg.message ) //reassign close button to minimize to tray
            {
                printf("close\r\n");
                break;
            }

            TranslateMessage(&msg);
            DispatchMessage(&msg);

            /*if( !IsDialogMessage( hwndListDialog, &msg ) )
            {
                TranslateMessage(&msg);
                DispatchMessage(&msg);
            }*/
        }
        Sleep( 5 );
    }
}

这是我的Windows过程:

代码语言:javascript
复制
LRESULT CALLBACK MainWndProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
    switch(uMsg)
    {
    case WM_CREATE:
        printf("Main Window Create.......SUCCESS");
        break;
    default:
        break;
    }

    return DefWindowProc( mainhwnd, uMsg, wParam, lParam );
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-03-19 23:21:09

我想问题出在你给DefWindowProc打的电话上。

尝试更改行:

代码语言:javascript
复制
    return DefWindowProc( mainhwnd, uMsg, wParam, lParam );

要这样做:

代码语言:javascript
复制
    return DefWindowProc( hwnd, uMsg, wParam, lParam );

我刚刚在这里编译了你的代码,并且运行正常。

票数 11
EN

Stack Overflow用户

发布于 2012-03-19 23:23:14

我会说您的MainWndProc被调用了,问题是您将mainhwnd作为DefWindowProc参数传递,而它仍然没有被初始化。你应该做的是:

代码语言:javascript
复制
return DefWindowProc( hwnd, uMsg, wParam, lParam );
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9772249

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档