【问题标题】:C winapi hwnd returning nullC winapi hwnd 返回 null
【发布时间】:2017-10-11 02:31:35
【问题描述】:

我已尽一切努力找出问题所在,但下面是我的代码,当我运行程序时,hwnd 返回NULL。可能是什么原因?代码看起来不错。该程序运行良好很长一段时间,直到 15 分钟前。我剪切了这部分源代码并再次运行它,但它仍然返回 NULL。这是我剪掉的那部分。

#include <windows.h>
#define IDI_MYICON 103

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam){
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {

//font

/*hFont = CreateFont(40,0,0,0,700,FALSE,FALSE,FALSE,DEFAULT_CHARSET,OUT_OUTLINE_PRECIS, CLIP_DEFAULT_PRECIS,ANTIALIASED_QUALITY, VARIABLE_PITCH,TEXT("a"));
hFontIpAdres = CreateFont(25,0,0,0,700,FALSE,FALSE,FALSE,DEFAULT_CHARSET,OUT_OUTLINE_PRECIS, CLIP_DEFAULT_PRECIS,ANTIALIASED_QUALITY, VARIABLE_PITCH,TEXT("a"));
hFontKurbanSecimi = CreateFont(30,0,0,0,700,FALSE,FALSE,FALSE,DEFAULT_CHARSET,OUT_OUTLINE_PRECIS, CLIP_DEFAULT_PRECIS,ANTIALIASED_QUALITY, VARIABLE_PITCH,TEXT("a"));
*/
  WNDCLASSEX wc;
  HWND hwnd;
  MSG msg;

  char *windowClassName = "class1";
  printf("%s\n", windowClassName);

  wc.cbSize        = sizeof(WNDCLASSEX);
  wc.style         = 0;
  wc.lpfnWndProc   = WndProc;
  wc.cbClsExtra    = 0;
  wc.cbWndExtra    = 0;
  wc.hInstance     = hInstance;
  wc.hIcon         = LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_MYICON));
  wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
  wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
  wc.lpszMenuName  =  NULL;//MAKEINTRESOURCE(IDR_MYMENU);
  wc.lpszClassName =  windowClassName;
  wc.hIconSm       =  NULL;//(HICON)LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_MYICON), IMAGE_ICON, 16, 16, 0);

  if(!RegisterClassEx(&wc))
  {
    printf("window registration failed\n");
  }

   printf("%s\n", windowClassName);
  hwnd = CreateWindowEx(
        WS_EX_CLIENTEDGE, windowClassName,"TTr",WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT, CW_USEDEFAULT, 240, 120,
        NULL, NULL, hInstance, NULL
      );
  if(hwnd == NULL){
    printf("could not create window hwnd %d\n", GetLastError());
  }
  ShowWindow(hwnd, SW_SHOW);
  UpdateWindow(hwnd);

  while(GetMessage(&msg, NULL, 0, 0) > 0){
    TranslateMessage(&msg);
    DispatchMessage(&msg);
  }
  return msg.wParam;
}

【问题讨论】:

  • “代码看起来不错。” - 编译器警告几乎不是我们相信的理由,代码很好。您不能声明返回类型,然后不从函数返回任何内容。任何关于 C 的介绍性书籍都解释了这一点。

标签: c windows winapi


【解决方案1】:

您的WndProc() 函数不返回任何内容。 CreateWindowEx() 实际上会使用一些基于创建的消息调用窗口进程。

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    return DefWindowProc(hwnd, msg, wParam, lParam);
}

【讨论】:

  • 你指的是WM_CREATE消息
  • @Asesh 这是CreateWindow/Ex() 在退出之前发送到窗口过程的众多消息之一。
  • @Asesh:鉴于问题中的代码,不会有WM_CREATE 消息。窗口创建在发送该消息之前终止。创建窗口时发送的消息是documented
猜你喜欢
  • 2021-08-09
  • 1970-01-01
  • 1970-01-01
  • 2023-04-10
  • 1970-01-01
  • 1970-01-01
  • 2023-03-07
  • 1970-01-01
  • 2014-04-25
相关资源
最近更新 更多