user-0 提问: 对话框过程函数的HWND句柄如何传递？

回复:
user: user-0
content: 谢谢赵老师，需要学习好多东西，从MSDN例程开始。

user: user-1
content: http://bbs.csdn.net/topics/390374955

user: user-0
content: 有没有高手指点下啊？？

user: user-1
content: 《深入浅出MFC》

user: user-0
content: 引用 20 楼 SXJIAKE 的回复:[quote=引用 19 楼 xiaobicai 的回复:]我没什么调试经验，这个值后面不是有unsued=???，表示什么意思？ 我就理解为没有值了，也就是无效的。 这样理解对吗？ 但是即便有值，但是因为句柄传递过来时，InitSocket(hDial)这个函数无法执行，所以我才认为是句柄传递 上出了问题。HWND 是一个对外隐藏的数据，系统并未开放，因此定义成什么都无所谓的。在 Windows SDK 头文件中被定义为一个只含有一个 int unused 成员的结构体指针。事实上，你并不需要关心这些，HWND 有值就行了。[/quote]   好的，非常感谢您的解答，非常深入。 HWND现在是有值了，但是我的问题还没解决。就是我的初始化函数为什么不行？ 就是InitSocket(hDial)这个函数放在ETHERNETCOMMDlgProc这个过程函数中不能执行。而问题就出在它接收的参数句柄上面， 请问这是什么问题？ 我目前的解决办法是将InitSocket(hDial)这个函数放在WndProc这个过程中了，是可以完成初始化动作的。 请问，问题出在哪里？请高手指点。

user: user-2
content: 引用 19 楼 xiaobicai 的回复:我没什么调试经验，这个值后面不是有unsued=???，表示什么意思？ 我就理解为没有值了，也就是无效的。 这样理解对吗？ 但是即便有值，但是因为句柄传递过来时，InitSocket(hDial)这个函数无法执行，所以我才认为是句柄传递 上出了问题。HWND 是一个对外隐藏的数据，系统并未开放，因此定义成什么都无所谓的。在 Windows SDK 头文件中被定义为一个只含有一个 int unused 成员的结构体指针。事实上，你并不需要关心这些，HWND 有值就行了。

user: user-0
content: 引用 17 楼 SXJIAKE 的回复:Value 不是有值吗  我没什么调试经验，这个值后面不是有unsued=???，表示什么意思？ 我就理解为没有值了，也就是无效的。 这样理解对吗？ 但是即便有值，但是因为句柄传递过来时，InitSocket(hDial)这个函数无法执行，所以我才认为是句柄传递 上出了问题。

user: user-0
content: 引用 16 楼 hoodlum1980 的回复:这函数是你通知给操作系统，由系统调用的。而不是你直接调用。 当你要调用窗口过程，通常是通过 SendMessage ( hWnd, ... ); 的方式间接调用。 那么 hWnd 这个参数你如何获知，也是通过调用以下 API ，通过返回值得到：  CreateWindow, CreateWindowEx, CreateDialogIndirect 等。  普通模态对话框：  DialogBoxParam ，这个函数不会返回 hWnd。要知道 hWnd，可以在 WM_INITDIALOG 消息中把 hWnd 参数保存起来。   首先感谢你讲得很深入。 我创建ETHERNETCOMMDlg对话框是在下面这个过程函数里的： LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) 创建对话框调用的是CreateDialog宏，它使用的是CreateDialogPara这个函数来创建对话框的，而CreateDialogPara这个函数 调用的是CreateWindow函数来创建对话框的，这个过程应该是在底层完成的。但是没关系，CreateDialog宏也能返回对话框的句柄，而我是想要在 LRESULT CALLBACK ETHERNETCOMMDlgProc(HWND hDlg, UINT message,WPARAM wParam, LPARAM lParam) 这个过程函数中将hDlg句柄传递进来的。但是在这个过程函数中，句柄失效，所以WM_INITDIALOG 消息无法起作用，我现在 在ETHERNETCOMMDlgProc这个过程函数中接收这个消息时是没做任何动作的。 本来应该把InitSocket(hDialogModeless_Ethernet)这个初始化函数函数放在ETHERNETCOMMDlgProc这个过程中的， 现在没办法，就只能放在WndProc这个过程中了，就是创建的同时初始化，而且，句柄hDlg也改成了全局变量hDialogModeless_Ethernet，以便在ETHERNETCOMMDlgProc过程中可以使用。  。。。。。。。 WndProc这个过程的部分代码如下：    case ID_ETHERNET:     				  //MessageBox(NULL,"ID_ETHERNET 执行到了","提示",MB_OK); 				 				  //创建非模态对话框 				 hDialogModeless_Ethernet=CreateDialog(hInstance, (LPCTSTR)IDD_ETHERNET_DLG, hwnd, (DLGPROC)ETHERNETCOMMDlgProc); 				 if(!hDialogModeless_Ethernet) 				 { 					  MessageBox(NULL,L"hDialogModeless_Ethernet 句柄无效 MMMM！!",L"提示",MB_OK); 					  break; 				 } 				 InitSocket(hDialogModeless_Ethernet); 				 ShowWindow(hDialogModeless_Ethernet,SW_SHOW);  				  				  break ;   说了上面这么多，不知道我有没有说清楚。

user: user-2
content: Value 不是有值吗

user: user-3
content: 这函数是你通知给操作系统，由系统调用的。而不是你直接调用。 当你要调用窗口过程，通常是通过 SendMessage ( hWnd, ... ); 的方式间接调用。 那么 hWnd 这个参数你如何获知，也是通过调用以下 API ，通过返回值得到：  CreateWindow, CreateWindowEx, CreateDialogIndirect 等。  普通模态对话框：  DialogBoxParam ，这个函数不会返回 hWnd。要知道 hWnd，可以在 WM_INITDIALOG 消息中把 hWnd 参数保存起来。

user: user-0
content: 引用 14 楼 csd123xitong 的回复:[quote=引用 8 楼 xiaobicai 的回复:] 那为什么会有HWND hDlg这个句柄参数，那不就是传递进来，让我可以使用的吗？而且，我确实需要用到这个参数啊。 请高手指点啊。 LRESULT CALLBACK ETHERNETCOMMDlgProc(HWND hDlg, UINT message,WPARAM wParam, LPARAM lParam) 在对话框过程函数里面，hDlg这个参数确实是可以直接用的。[/quote]   之前试过了的，在过程函数中初始化时， InitSocket(hDlg)这个函数是无法执行的，因为hDlg句柄的值未知。 所以，现在我才放到创建对话框函数的后面进行初始化的。  有没有高手指点下啊。

user: user-4
content: 引用 8 楼 xiaobicai 的回复:那为什么会有HWND hDlg这个句柄参数，那不就是传递进来，让我可以使用的吗？而且，我确实需要用到这个参数啊。 请高手指点啊。 LRESULT CALLBACK ETHERNETCOMMDlgProc(HWND hDlg, UINT message,WPARAM wParam, LPARAM lParam) 在对话框过程函数里面，hDlg这个参数确实是可以直接用的。

user: user-4
content: 你好像单步执行没进到case里面，在case里面还是？？？吗

user: user-5
content: 过程函数是系统调用的啊，或者说是你运行消息队列那段代码时调用的啊，句柄的指向内容肯定未知啊，因为它是void*类型的啊

user: user-0

user: user-0
content: 单步调试的值，请看图片：

user: user-0
content: 我单步执行的，HWND hDlg这个句柄的值就是问号？？？

user: user-6
content: 引用 8 楼 xiaobicai 的回复:那为什么会有HWND hDlg这个句柄参数，那不就是传递进来，让我可以使用的吗？而且，我确实需要用到这个参数啊。 请高手指点啊。 LRESULT CALLBACK ETHERNETCOMMDlgProc(HWND hDlg, UINT message,WPARAM wParam, LPARAM lParam)  什么叫传不进来，不可能

user: user-0
content: 那为什么会有HWND hDlg这个句柄参数，那不就是传递进来，让我可以使用的吗？而且，我确实需要用到这个参数啊。 请高手指点啊。 LRESULT CALLBACK ETHERNETCOMMDlgProc(HWND hDlg, UINT message,WPARAM wParam, LPARAM lParam)

user: user-4
content: 对话框过程函数是一个回调函数，回调函数是由系统调用的，hwnd是由系统调用回调函数时，由系统传递的。