【问题标题】:ERROR_INVALID_WINDOW_HANDLE from CreateWindowEx()来自 CreateWindowEx() 的 ERROR_INVALID_WINDOW_HANDLE
【发布时间】:2012-03-19 14:44:50
【问题描述】:

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

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

我还尝试将W 添加到随机函数和数据类型中,希望 UNICODE 版本能以某种方式工作……当然,没有任何改变。

这是调用 CreateWindowEx() 的函数:

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;
}

这是主要的方法:

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 程序:

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 );
}

【问题讨论】:

  • 1. RegisterClassEx 调用的结果是什么? 2.你的window proc被调用了吗?
  • @Mr.Disappointment 我确实调用了 GetLastError(),这就是我知道我收到 ERROR_INVALID_WINDOW_HANDLE 的方式。
  • @RomanR。我刚刚将我的 Windows 程序添加到问题中。它永远不会被调用。
  • 在WM_CREATE 上返回0 会改变什么吗?
  • @pezcode 不幸的是,它没有。 CreateWindowEx() 函数本身失败了,这意味着它一开始就永远无法到达 Wndproc。

标签: c++ winapi user-interface window


【解决方案1】:

我认为问题在于您对 DefWindowProc 的调用。

换行试试:

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

到这里:

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

我刚刚在这里编译了您的代码并进行了更改,它可以正常工作。

【讨论】:

  • 谢谢!这是一个愚蠢的错误,我不是故意输入 mainhwnd。
【解决方案2】:

我会说你的MainWndProc IS 调用了,问题是你将mainhwnd 作为 DefWindowProc 参数传递,而它仍未初始化。你应该这样做:

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

【讨论】:

    猜你喜欢
    • 2021-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-21
    • 2011-01-17
    • 1970-01-01
    相关资源
    最近更新 更多