#include <windows.h>
HINSTANCE g_hInst1 = NULL;
HINSTANCE g_hInst2 = NULL;
HWND g_hWnd1 = NULL;
HWND g_hWnd2 = NULL;
HWND g_hWnd3 = NULL;
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
g_hWnd3 = hWnd;// 核实一下窗口句柄
switch(uMsg)
{
case WM_CREATE:
{
g_hInst2 = (HINSTANCE)(((LPCREATESTRUCT)lParam)->lpCreateParams);// 提取出传过来的程序句柄存入g_hInst2
SetWindowLong(hWnd, GWL_USERDATA, (LONG)hWnd);// 压入当前的窗口句柄
}
}
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, int nCmdShow)
{
g_hInst1 = hInst;// 记录程序句柄在g_hInst1;
WNDCLASS wc;
wc.style = 0;
wc.lpfnWndProc = WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInst;
wc.hIcon = NULL;
wc.hCursor = NULL;
wc.hbrBackground = NULL;
wc.lpszMenuName = NULL;
wc.lpszClassName = "haha";
RegisterClass(&wc);
g_hWnd1 = CreateWindowEx(0, "haha", "hahaha", WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL, hInst, (void*)hInst) ;// 记录窗口句柄在g_hWnd1,并把程序句柄给消息处理函数
g_hWnd2 = (HWND)GetWindowLong(g_hWnd1, GWL_USERDATA);// 提取消息函数中被压入的数值
DestroyWindow(g_hWnd1);
UnregisterClass("haha", hInst);
return 0;
}
上面是我的验证程序,试图自己封装窗口类的应该已经看明白了,几个全局变量用来记录数据传递情况
下面是调试跟踪的情况:
可以看到数据被正确传递了,但是也带来两个问题:
1.WNDCLASS的cvWndExtra在这种情况下没用,它的具体作用到底是什么?
2.windows API参考大全上说的,SetWindowLong只有在SetWindowPos之后才能起作用难道是错的?