HANDLE hSem = CreateSemaphore(NULL, 1, 1, "只能开一个");
while( GetLastError() == ERROR_ALREADY_EXISTS)
{
AfxMessageBox("已启动一个程序!" , MB_ICONINFORMATION|MB_OK);
// 能否通过信号量找到创建该信号量的进程,并激活到最前面显示???
return FALSE;
}
while( GetLastError() == ERROR_ALREADY_EXISTS)
{
AfxMessageBox("已启动一个程序!" , MB_ICONINFORMATION|MB_OK);
// 能否通过信号量找到创建该信号量的进程,并激活到最前面显示???
return FALSE;
}
解决方案 »
- ado访问Oracle的问题,初次接触
- 指针调用问题
- [共享]MFC中CMAP对象的创建与释放,防止内存泄漏
- <<<---->>>除了 WS_EX_TOOLWINDOW 外,还有那些方法使 窗口标题 不在 任务栏 里 显示按钮 ?
- !!!!!!北京需要找高级界面编程高手。!!!!!!
- 基于dialog的MFC程序能够使用系统托盘么?
- 请问有下载源代码的地方吗?新手上路,多多指教。
- strcpy能强制CString 转换为char *的,为什么我的函数不行?
- 怎样将我接到的数据转换成字符形式?谢谢!
- 把整形,浮点型,转换成字符串用那个命令?
- 如何动态切换窗口的所属桌面??
- 想做一个dll,只有一个函数,函数在界面取得2个double,然后返回2个数的和
HANDLE OpenSemaphore(
DWORD dwDesiredAccess, // 访问标志
BOOL bInheritHandle, // 继承标志
LPCTSTR lpName // 信号量名
);
HANDLE hSem = CreateSemaphore(NULL, 1, 1, "1111");
if( GetLastError() == ERROR_ALREADY_EXISTS)
{
HWND hwnd=FindWindow("#32770", NULL);
if (IsWindow(hwnd))
{
AfxMessageBox("getit");
} LRESULT hr = SendMessage(hwnd, WM_CLOSE, 0, 0);
BOOL bSuccess = DestroyWindow(hwnd);
find成功:getit 弹出message对话框我试着关闭他,但是失败了 sendmessage的LResult为0,证明发送成功; bSuccess为0,销毁失败。
激活到前面的消息估计会有类同的结果
如果你的窗口类不是自己建的,就不要用这种方法
使用其他方法来进程间通信,比如mailslot
{
hProcess=OpenProcess(PROCESS_ALL_ACCESS, FALSE, ProcessID);
TerminateProcess(hProcess, 0);
}
初步想法是 通过判断该程序路径下的是否有特定文件去反证取得的窗口是我所期望的。
if( GetLastError() == ERROR_ALREADY_EXISTS)
{
// 通过类名找到进程
HWND hWnd=FindWindow("#32770", NULL);
while (IsWindow(hWnd))
{
if(GetWindowThreadProcessId(hWnd, &ProcessID) !=0)
{
hProcess=OpenProcess(PROCESS_ALL_ACCESS, FALSE, ProcessID);
char strFileName[256];
if ( GetModuleFileNameEx(hProcess, NULL, strFileName, 256) != 0)
{
// 进程全路径
CString strPath;
strPath.Format("%s", strFileName);
int nPos =strPath.ReverseFind( '\\');
strPath=strPath.Left(nPos);
CString strxxxFile = strPath + "\\xxxx.dll";
if ( PathFileExists(strxxxFile) ) // 文件存在
{
//然后kill掉进程并退出循环
TerminateProcess(hProcess, 0);
break;
}
}
hWnd=FindWindow("#32770", NULL);
}
}
}
{
//窗口是否可视
if (!IsWindowVisible(hwnd))
return TRUE; //窗口是否可激活
if (!IsWindowEnabled(hwnd))
return TRUE; //窗口是否 WS_POPUP 与 WS_CAPTION 共存
//一些可切换的窗体同时具有 WS_POPUP 与 WS_CAPTION,因而有 WS_POPUP 却无 WS_CAPTION 的应被过滤
//据 Spy++ 观察,符合如 OneNote TrayIcon 等程序可通过此方式过滤
LONG gwl_style = GetWindowLong(hwnd,GWL_STYLE);
if ((gwl_style & WS_POPUP) && !(gwl_style & WS_CAPTION))
return TRUE; //窗口是否具有父窗口?
HWND hParent = (HWND)GetWindowLong(hwnd,GWL_HWNDPARENT);
//父窗口是否可激活?
//据 Spy++ 观察,如“运行”对话框等被应列入列表的程序有一个隐藏的,具有 WS_DISABLED 的父窗口
if (IsWindowEnabled(hParent))
return TRUE;
//父窗口是否可视?
if (IsWindowVisible(hParent))
return TRUE; //一个非常奇怪的问题在于,任务栏 Shell_TrayWnd 符合上述过滤条件但是无法被过滤。
//因而在这里单独列出。
TCHAR szClassName[MAX_LOADSTRING];
GetClassName(hwnd,szClassName,MAX_LOADSTRING);
if (!wcscmp(szClassName,L"Shell_TrayWnd"))
return TRUE;
}