我们经常会让窗口只运行一个实例,当发现已有实例运行时,需要显示出正在运行的实例窗口
FindWindow有两个参数:
1.窗口类名
2.窗口标题
窗口标题可以随便更改,而且很容易跟不相关的窗口重名,不可靠
窗口类名相对可靠得多
===================================================================
对于SDK中调用CreateWindow产生的程序
在CreateWindow之前会注册WNDCLASS,直接在结构体内设置即可
=======================================================================
对于SDK中调用DialogBox产生的对话框程序
1. 资源视图中选中xxx.rc节点,设置属性MFC Mode为“false”
2. 资源视图中打开对话框,对话框属性中,设置Class Name为“xxxclass”
以上两步是在xxx.rc文件中给DLGBOX一节加了个 CLASS xxxclass
3. 在调用DialogBox函数前加入以下代码
WNDCLASS wc;
wc.style = CS_DBLCLKS | CS_SAVEBITS | CS_BYTEALIGNWINDOW;
wc.lpfnWndProc = DefDlgProc; /*这个地方写Windows对话框默认处理函数*/
wc.cbClsExtra = 0;
wc.cbWndExtra = DLGWINDOWEXTRA;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_MAINICON));
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground=(HBRUSH)COLOR_WINDOW + 1;
wc.lpszMenuName = NULL;
wc.lpszClassName= "_WindowUtilSemXXX_";
RegisterClass(&wc);
====================================================================
对于基于对话框的MFC程序
1. 资源视图中选中xxx.rc节点,设置属性MFC Mode为“false”
2. 资源视图中打开对话框,对话框属性中,设置Class Name为“xxxclass”
3. 再把1步中的属性MFC Mode设为“false” (可选)
4. 在你的CXXXApp的InitInstance中加入下列代码
WNDCLASS wc;
::GetClassInfo(AfxGetInstanceHandle(), "#32770 ", &wc);
wc.lpszClassName = "xxxclass"; // 这里于第2步的字符串必须一样
::RegisterClass(&wc);
====================================================================
对于基于MDI/SDI的MFC程序
1. 通过调用 GetClassInfoEx 来获得想要进行超类化操作的窗口类的信息。函数GetClassInfoEx 需要一个指向 WNDCLASSEX 结构的指针,用于当成功返回时填入窗口类的信息。
2. 按需要修改 WNDCLASSEX 结构的成员,其中有两个成员必须修改:
hInstance 存放程序的实例句柄
lpszClassName 指向一个新类名的指针
不必修改成员 lpfnWndProc,但大多数情况下还是需要的。但要记住如果要使用函数CallWindowProc
调用老窗口的过程,那就必须保存成员 lpfnWndProc 的原值。
3. 注册修改完的 WNDCLASSEX 结构,得到一个具有旧窗口类某些特性的新窗口类。
4. 用新窗口类创建窗口
由此修改主窗口类名的可以如下操作:
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
if( !CFrameWnd::PreCreateWindow(cs) )
return FALSE;
//修改主窗口类名
WNDCLASS wndclass;
//GetClassInfo返回注册窗口类信息
::GetClassInfo(AfxGetInstanceHandle(),cs.lpszClass,&wndclass);
//重新设置窗口类的类名
wndclass.lpszClassName="New ClassName";
//重新注册新的窗口类
VERIFY(AfxRegisterClass(&wndclass));
// 利用新注册的类名修改主窗口类名
cs.lpszClass=wndclass.lpszClassName;
return TRUE;
}