在VC程序中我们经常要获取到某一指定程序的窗体句柄,大家经常用到的两个函数的是
FindWindow和FindWindowEx,两函数的具体用法可参考MSDN。
其中FindWindow函数可以通过窗体的名字来找
例如 HWND hwnd = ::FindWindow(NULL, "窗体名");
而FindWindowEx通过窗体的类名来找
例如 HWND hwnd =::FindWindowEx(0,0, TEXT("窗体类名"), NULL); 其中窗体类名是程序对话框注册的类名,例如通过spy++查看的微软的IE浏览器的类名一般为"IEFrame", 然而很多人发现自己写的MFC程序的窗体的类名用SPY++查看之后得出的类名都是固定的“ #32770 ”,其实是你没有设置,微软给你个默认的名字罢了,你可以自己设置,操作步骤如下。
微软官方解答地址:
http://support.microsoft.com/kb/251059
第一步 在窗体属性中修改类名
第二步 在InitInstance中注册窗体名
若要提供自己的窗口类名,请执行以下步骤:
1 打开包含对话框中,您项目的工作空间,然后单击ResourceView。
2 在资源编辑器中打开对话框。用鼠标右键单击对话框,然后选择属性。注意到为类名在右下角的一个条目。如果您正在使用 Microsoft 基础类库支持的资源文件,则该编辑框被禁用。要启用此选项,请切换到顶级节点上的资源视图中,然后右键单击并选择属性。清除启用 MFC 功能复选框。或 Visual C++.net,清除MFC 模式属性为 FALSE。现在显示的对话框中的属性。应启用类名称编辑框。键入类的名称 ;例如 MyPrivateClassName。
另外,作为文本文件打开.rc 文件。转到所需的对话框资源,然后添加类别选项。
IDD_LIMITDLGINSTANCE_DIALOG DIALOGEX 0, 0, 195, 44
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
EXSTYLE WS_EX_APPWINDOW
CAPTION "LimitDlgInstance"
CLASS "MyPrivateClassName" // Add your class name here!
FONT 8, "MS Sans Serif"
BEGIN
DEFPUSHBUTTON "OK",IDOK,138,7,50,14
PUSHBUTTON "Cancel",IDCANCEL,138,23,50,14
PUSHBUTTON "&Test!",IDC_BUTTON1,48,14,49,15
END
CWinApp 派生类的InitInstance()函数中添加以下代码。
BOOL CLimitDlgInstanceApp::InitInstance()
{
/
/
WNDCLASS wc;
// Get the info for this class.
// #32770 is the default class name for dialogs boxes.
::GetClassInfo(AfxGetInstanceHandle(), "#32770", &wc);
// Change the name of the class.
wc.lpszClassName = "MyPrivateClassName";
// Register this class so that MFC can use it.
AfxRegisterClass(&wc);
/
/
// ...
}
3 在第步中,在调用:: GetClassInfo(),请确保使用正确的 HINSTANCE 调用,如果对话框资源都位于单独的 DLL。
4 生成并运行您的应用程序。使用 Spy + + 工具来验证对话框现在使用新的类名。