C++ 即使CreateWindowEx看似成功,WinAPI ShowWindow也会失败

C++ 即使CreateWindowEx看似成功,WinAPI ShowWindow也会失败,c++,winapi,C++,Winapi,我在使用CreateWindowEx时遇到问题。如果我将最终参数(LPVOID lpParam)设置为NULL,并在调用ShowWindow时使用返回的窗口句柄,则窗口会显示所有内容。但是,我需要传入一个指向我将根据截获的一些操作系统消息修改的类的指针。当我尝试这样做时,通过将lpParam指定为this,我返回的句柄显然是垃圾,因为将其传递到ShowWindow会导致:“在用户回调期间遇到未经处理的异常。” 我不知道如何调试这个,所以我被卡住了 所指向的地址在传入和拉出之间保持不变 我没有定义

我在使用CreateWindowEx时遇到问题。如果我将最终参数(LPVOID lpParam)设置为NULL,并在调用ShowWindow时使用返回的窗口句柄,则窗口会显示所有内容。但是,我需要传入一个指向我将根据截获的一些操作系统消息修改的类的指针。当我尝试这样做时,通过将lpParam指定为this,我返回的句柄显然是垃圾,因为将其传递到ShowWindow会导致:“在用户回调期间遇到未经处理的异常。”

我不知道如何调试这个,所以我被卡住了

所指向的地址在传入和拉出之间保持不变

我没有定义WM_颜料盒

WM_创建处理程序:

case WM_CREATE:
{

            // get screen resolution
            HWND desktop = GetDesktopWindow();
            RECT R;
            GetWindowRect(desktop, &R);
            int width = R.right - R.left;
            int height = R.bottom - R.top;

            HWND loading_image;
            loading_image = CreateWindowEx(0,L"Static",L"Image", SS_CENTERIMAGE | SS_BITMAP | WS_CHILD | WS_VISIBLE,0,0,width,height,hwnd,(HMENU)ID_IMAGE3,g_hInst,NULL); 
            SetClassLong(loading_image,GCL_STYLE,CS_HREDRAW | CS_VREDRAW);
            HBITMAP bitmap = (HBITMAP)LoadImage(NULL,L"loadingscreen.bmp", IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
            SendMessage(loading_image,STM_SETIMAGE, (WPARAM)IMAGE_BITMAP, (LPARAM)bitmap);

            progressbar = CreateWindowEx(0, PROGRESS_CLASS, (LPTSTR)NULL, WS_CHILD | PBS_SMOOTH | WS_VISIBLE, width/2-400,100,800,20,hwnd,(HMENU)0,g_hInst,NULL);
            SendMessage(progressbar,PBM_SETSTEP,20,NULL);

            CREATESTRUCT* cs = (CREATESTRUCT*)lParam;
            app = (D3DApp*)cs->lpCreateParams;
            return 0;
}

WindowProc调用在70 msg(WM_WINDOWPOSCHANGING)上出错。它在以前的消息中并没有坏掉:WM_NCCALCSIZE、WM_CREATE、WM_PARENTNOTIFY、WM_SIZE、WM_SIZE或WM_SHOWWINDOW,尽管WM_SHOWWINDOW是在WM_WINDOWPOSCHANGING之前处理的,所以我猜WM_WINDOWPOSCHANGING只是通过WM_SHOWWINDOW的结果。

CreateWindowEx
上设置一个断点。写下你要传递的指针

在WindowProc函数上设置断点。检查它从您的私有窗口数据中提取的指针(您存储指针的地方,对吗?)是否与传入的相同。您使用的是
SetProp
GetProp
(请参阅MSDN上的主题)而不是
SetWindowLongPtr
,对吗


在进入WindowProc时,打印出消息编号,以便在消息崩溃时查看正在处理的消息(如果您的调试器支持跟踪点,您可以使用跟踪点进行此操作,或者向代码添加
printf
调用并重新编译。

CreateWindowEx
上放置断点。记下您传递的指针

在WindowProc函数上设置断点。检查它从私有窗口数据中提取的指针(即存储指针的位置,对吗?)是否与传入的指针相同。您使用的是
SetProp
GetProp
(请参阅MSDN主题),而不是
SetWindowLongPtr
,对吗


在进入WindowProc时,打印出消息编号,以便在消息崩溃时查看正在处理的消息(如果您的调试器支持跟踪点,您可以为此使用跟踪点,或者为代码添加一个
printf
调用并重新编译。

您是否意识到
CreateWindowEx
在返回之前发送消息?这意味着您的
WindowProc
必须处理它们。您没有显示该代码,但调用CreateWi是一个常见错误。)ndowEx太早。

您是否意识到
CreateWindowEx
在返回之前发送消息?这意味着您的
WindowProc
必须处理它们。您没有显示该代码,但过早调用CreateWindowEx是一个常见的错误。

也许您已经有了答案,但我认为罪魁祸首在:

SetClassLong(加载图像,GCL样式,CS|HREDRAW | CS|VREDRAW)


你为什么要这样做?

也许你已经有了答案,但我认为罪魁祸首是:

SetClassLong(加载图像,GCL样式,CS|HREDRAW | CS|VREDRAW)


你为什么需要这样做?

听起来你的
WM\u CREATE
消息处理程序有问题。你应该发布它。或者
WM\u PAINT
处理程序有问题。或者
WM\u ERASEBACKGROUND
。或者
WM\u POSCHANGING
。或者你的窗口出现时发送的任何东西。很可能有一些交互在
WM\u CREATE
WM\u PAINT
之间——你应该发布两者的相关源代码。听起来你的
WM\u CREATE
消息处理程序有问题。你应该发布它。或者
WM\u PAINT
处理程序有问题。或者
WM\u ERASEBACKGROUND
或者
WM\u POSCHANGING
。或者任何类似的东西当您的窗口出现时发送。很可能在
WM_CREATE
WM_PAINT
之间有一些交互作用——您应该发布这两个的相关源代码。我没有使用
SetProp
GetProp
SetWindowLongPtr
。我应该在哪里使用它们?我只是将我的窗口句柄设置为这个返回值值:
CreateWindowEx(WS_EX_TOPMOST,L“D3DWndClassName”,L“name”,WS_弹出窗口,CW_USEDEFAULT,CW_USEDEFAULT,width,height,NULL,NULL,mhAppInst,this);
“我需要传递一个指向类的指针”…如果你将它传递给
CreateWindowEx
,你将它作为
CREATESTRUCT
的一部分输入
(您已经计算出了该部分),然后您需要使用
SetProp
使其可用于将来的消息。您是否有
WM\u WINDOWPOSCHANGING
的处理程序?是否尝试使用
app
指针(该指针在
WM\u CREATE
中设置,但随后超出范围)?我没有使用
SetProp
GetProp
,或者
SetWindowLongPtr
。我应该在哪里使用它们?我只是将我的窗口句柄设置为这个返回值:
CreateWindowEx(WS_EX_最顶端,L“D3DWndClassName”,L“name”,WS_弹出窗口,CW_USEDEFAULT,CW_USEDEFAULT,width,NULL,NULL,mhAppInst,this);
“我需要传入一个指向类的指针”…如果您将其传递给
CreateWindowEx
,那么它将作为
CREATESTRUCT
的一部分进入
WM\u CREATE
(您已经计算出了该部分),然后您需要使用
SetProp
使其可用于将来的消息。您是否有
WM\u WINDOWPOSCHANGING
的处理程序?它是否试图使用
app
指针(该指针在
WM\u CREATE
中设置,但随后超出范围)?