以下技术,只提供函数名和简单应用事例。详细内容参看MSDN,事例中的代码如无特别说明版权归microsoft所有
1:判断窗口最小化最大化状态
最小化到任务栏使用IsIconic()函数判断
最大化通过IsZoomed()函数判断
GetWindowPlacement(),调用此函数可以获取窗口的正常状态,最大化,最小化。通过WINDOWPLACEMENT结构体进行判断。
2:一个应用程序只有一个实例
1:使用FindWindow函数,如果发现指定创建已经存在,就退出
FindWindow第一个参数为查找窗口的类名。
FindWindow第二个参数为查找窗口的标题名(最好选择这个)
2:使用Mutex互斥体
// Create mutex, because there cannot be 2 instances for same application
HANDLE hMutex = CreateMutex(NULL, FALSE, "ugg");
// Check if mutex is created succesfully
switch(GetLastError())
{
case ERROR_SUCCESS:
// Mutex created successfully. There is no instance running
break;
case ERROR_ALREADY_EXISTS:
// Mutex already exists so there is a running instance of our app.
return FALSE;
default:
// Failed to create mutex by unknown reason
return FALSE;
}
3:改变窗口或者控件大小和移动窗口或者控件位置
1:MoveWindow函数,改变窗口的大小和位置
CRect rc;
GetClientRect(&rc);
m_Button.MoveWindow(0, 0, rc.Width(), rc.Height());
2:SetWindowPos函数,可以应用Z轴方向上,改变重叠控件的显示次序。
void CWinApp::HideApplication()
{
//m_pMainWnd is the main application window, a member of CWinApp
ASSERT_VALID(m_pMainWnd);
// hide the application's windows before closing all the documents
m_pMainWnd->ShowWindow(SW_HIDE);
m_pMainWnd->ShowOwnedPopups(FALSE);
// put the window at the bottom of z-order, so it isn't activated
m_pMainWnd->SetWindowPos(&CWnd::wndBottom, 0, 0, 0, 0,
SWP_NOMOVE|SWP_NOSIZE|SWP_NOACTIVATE);
}
4:改变窗口的最大化最小化正常状态
1:SetWindowPlacement函数
设置窗口最大化最小化显示状态,通过WINDOWPLACEMENT结构体进行设置
2:POST,Send这三种SC_MAXIMIZE,SC_MINIMIZE,SC_RESTORE命令消息
PostMessage(WM_SYSCOMMAND, SC_MAXIMIZE,0);// 最大化
PostMessage(WM_SYSCOMMAND, SC_ MINIMIZE,0);// 最小化
PostMessage(WM_SYSCOMMAND, SC_RESTORE,0);// 正常
5:更改窗口或者控件的注册类名
在默认的情况下,MFC的窗口或者控件的注册类名是MFC自动生成,比如Dialog的注册类名为”#32770”,CButton的注册类名为”Button”等,在一些hook应用中,我们可能需要修改这些注册类名。可以采用如下方法
重载窗口或者控件的PreCreateWindows函数,在函数内做如下修改
BOOL CMyDilaolg::PreCreateWindow(CREATESTRUCT& cs)
{
WNDCLASS wndcls;
ZeroMemory( &wndcls, sizeof(WNDCLASS) );
wndcls.style = CS_DBLCLKS;
wndcls.lpfnWndProc = AfxWndProc;
wndcls.hInstance = AfxGetInstanceHandle();
wndcls.hIcon = AfxGetApp()->LoadIcon( IDI_APPLICATION );
wndcls.hCursor = AfxGetApp()->LoadStandardCursor( IDC_ARROW );
wndcls.hbrBackground = NULL;
wndcls.lpszMenuName = NULL;
wndcls.lpszClassName = _T("uggDialog");
AfxRegisterClass( &wndcls );
cs.lpszClass = wndcls.lpszClassName; // 设置控件的注册类名
return CDialog::PreCreateWindow( cs );
}