让MFC程序只能运行一个:
使用互斥对象CreateMutex();
BOOL CpipeApp::InitInstance()
{
m_hMute = ::CreateMutex(NULL, FALSE, "ss");
if (GetLastError() == ERROR_ALREADY_EXISTS)
{
return FALSE;
}
}
将已运行的实例调到前台
int CpipeDlg::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CDialogEx::OnCreate(lpCreateStruct) == -1)
return -1;
//添加窗口属性
::SetProp(m_hWnd, AfxGetApp()->m_pszExeName, (HANDLE)1);
return 0;
}
void CpipeDlg::OnDestroy()
{
CDialogEx::OnDestroy();
::RemoveProp(m_hWnd, AfxGetApp()->m_pszExeName);
}
BOOL CpipeApp::InitInstance()
{
m_hMute = ::CreateMutex(NULL, FALSE, "ss");
if (GetLastError() == ERROR_ALREADY_EXISTS)
{
CWnd* pDesktopWnd = CWnd::GetDesktopWindow();
CWnd* pWnd = pDesktopWnd->GetWindow(GW_CHILD);
while (pWnd != NULL)
{
if (::GetProp(pWnd->m_hWnd, m_pszExeName))
{
pWnd->SetForegroundWindow();
return FALSE;
}
pWnd = pWnd->GetWindow(GW_HWNDNEXT);
}
return FALSE;
}
}
发送消息:向本窗体或外部窗体发送消息。
SendMessage();
效果图
定义几个全局变量首先:
HICON m_hIcon;
HCURSOR m_hCursor;
RECT m_rtCtrl;
BOOL m_bCapturing;
HWND m_hwndDest;
然后初始化对话框中添加:
m_hCursor = LoadCursor(NULL, IDC_SIZEALL);
GetDlgItem(IDC_CAP)->GetWindowRect(&m_rtCtrl);//picture控件Icon类型
void CSendMessageDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
if (point.x >= m_rtCtrl.left && point.x <= m_rtCtrl.right
|| point.y >= m_rtCtrl.top && point.y <= m_rtCtrl.bottom)
{
m_bCapturing = true;
SetCapture();//开始捕获鼠标
SetCursor(m_hCursor);
}
CDialogEx::OnLButtonDown(nFlags, point);
}
void CSendMessageDlg::OnLButtonUp(UINT nFlags, CPoint point)
{
if (m_bCapturing)
{
ReleaseCapture();
m_bCapturing = false;
POINT pt = point;//移动到记事本里坐标
ClientToScreen(&pt);
m_hwndDest = ::WindowFromPoint(pt);
TCHAR szBuf[MAX_PATH] = { 0 };
_stprintf_s(szBuf, L"0x%.8X", m_hwndDest);
CString str;
SetDlgItemText(IDC_EDIT_HWND, szBuf);
GetClassName(m_hwndDest, szBuf, MAX_PATH);
SetDlgItemText(IDC_EDIT_CLASEENAME, szBuf);
::SendMessage(m_hwndDest, WM_GETTEXT, MAX_PATH, (LPARAM)szBuf);
SetDlgItemText(IDC_EDIT_NAME, szBuf);
}
CDialogEx::OnLButtonUp(nFlags, point);
}
void CSendMessageDlg::OnBnClickedButton1()
{
CString str;
GetDlgItemText(IDC_EDIT_NAME, str);
::SendMessage(m_hwndDest, WM_SETTEXT, 0, (LPARAM)(LPCTSTR)str);
}
void CSendMessageDlg::OnBnClickedButton2()
{
::SendMessage(m_hwndDest, WM_CLOSE, 0, 0);
}
格式化字符串 :_stprintf_s
HWND hEdit = ::GetDlgItem(m_hWnd, IDC_EDIT_INPUT);//通过sendmesssage可以获取编辑框中字符串的长度
int nlen = ::SendMessage(hEdit, WM_GETTEXTLENGTH, 0, 0);
TCHAR szBuf[128] = { 0 };
_stprintf_s(szBuf, L"%d", nlen);