一、VC防止同一个程序运行两个实例
防止同一个程序运行两个实例: 在app类的cpp的InitInstance函数中:HANDLE hMutex; BOOL CDeskTopLockApp::InitInstance() { CString strName = _T("DeskTopLockApplication"); hMutex = OpenMutex(MUTEX_ALL_ACCESS, false, strName); if(hMutex == NULL) { hMutex = CreateMutex(NULL,NULL,strName); } else { AfxMessageBox(_T(" 桌面锁已启动 !")); return false; } …………………………………… m_nCmdShow=SW_HIDE; //程序启动时隐藏窗口A if (!ProcessShellCommand(cmdInfo)) return FALSE; // The one and only window has been initialized, so show and update it m_pMainWnd->ShowWindow(SW_HIDE); //程序启动时隐藏窗口B m_pMainWnd->UpdateWindow(); // call DragAcceptFiles only if there's a suffix // In an SDI app, this should occur after ProcessShellCommand return TRUE; }
二、VC编写任务栏右下角图标程序
//任务栏右下角图标程序:
//在CMainFrame头文件中定义变量:
NOTIFYICONDATA nid;
//在OnCreate函数中或者初始化函数中:
nid.cbSize = sizeof(NOTIFYICONDATA);
nid.hWnd = m_hWnd;
nid.uID = IDI_SYSTEMTRAY; //图标的ID
nid.uFlags = NIF_MESSAGE|NIF_ICON|NIF_TIP;
nid.uCallbackMessage = WM_SYSTEMTRAY; //图标对应的消息的ID
nid.hIcon = AfxGetApp()->LoadIcon(IDI_SYSTEMTRAY);
wcscpy_s(nid.szTip,10, L"桌面锁");
::Shell_NotifyIcon(NIM_ADD,&nid);
//用ON_MESSAGE将WM_SYSTEMTRAY与消息函数绑定:
LRESULT CMainFrame::OnSystemTray(WPARAM wParam, LPARAM lParam)
{
if(wParam == IDI_SYSTEMTRAY)
{
switch(lParam)
{
case WM_LBUTTONDOWN:
{
break;
}
case WM_RBUTTONDOWN:
{
break;
}
case WM_LBUTTONDBLCLK:
{
break;
}
}
}
return 0;
}
//在程序退出之前还要:
NOTIFYICONDATA nid;
nid.cbSize = sizeof(NOTIFYICONDATA);
nid.hWnd = m_hWnd;
nid.uID = IDI_SYSTEMTRAY;
nid.uFlags = 0;
::Shell_NotifyIcon(NIM_DELETE, &nid);
三、隐藏窗口
//本函数实现隐藏窗口
NOTIFYICONDATA nid;
nid.cbSize=sizeof(NOTIFYICONDATA);
nid.hWnd=this-> m_hWnd;
nid.uFlags=NIF_MESSAGE|NIF_ICON|NIF_TIP;
nid.uID=IDR_MAINFRAME;
nid.hIcon=AfxGetApp()-> LoadIcon(IDI_CCEYE);
strcpy(nid.szTip, "AppName V1.0 ");
nid.uCallbackMessage=WM_USER+100;//窗口消息
Shell_NotifyIcon(NIM_ADD,&nid);
ShowWindow(SW_HIDE);//放在 需要的地方
//该部分负责退出时销毁图标
NOTIFYICONDATA nid;
nid.cbSize=sizeof(nid);
nid.uID=IDI_CCEYE;
nid.hWnd=this-> m_hWnd;
Shell_NotifyIcon(NIM_DELETE,&nid);