请高手求救!!!!!!!!!!!!!!!!!!!!!!

dronly 2010-04-15 08:09:43
我想做这么一个功能:
有一个我的程序生成的工程文件在桌面,双击这个文件,如果程序没有实例,则启动程序,打开文件,如果程序已经有实例,则从最小化还原前一个实例窗口或者前置,打开文件。

注意:
我现在打开文件不是用的CDocument::OnOpenDocument,而是用的是我自己的菜单ID_PROJECT_OPEN下做的功能

以上应该怎么做?

最后又具体代码,因为项目很急,顶者有分。
...全文
144 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
dronly 2010-04-15
  • 打赏
  • 举报
回复
非常感谢,我试过貌似只有hahaking119的方法可以,谢谢大家,马上结贴给分。
kingjames23 2010-04-15
  • 打赏
  • 举报
回复
不懂,但会顶,会接分
warsour 2010-04-15
  • 打赏
  • 举报
回复
就是检测程序是否运行,如果运行就发消息给他,然后程序做处理打开你的文件
hahaking119 2010-04-15
  • 打赏
  • 举报
回复
要做一个单例,可以通过任务管理器查找你的应用程序,或者用文件映射的方式
/**
* 具有界面的应用程序单体
*/
class SingletonGuiApp
{
// 禁止拷贝
private:
SingletonGuiApp(SingletonGuiApp&);
SingletonGuiApp& operator=(const SingletonGuiApp&);

public:
static SingletonGuiApp& Instance()
{
static SingletonGuiApp s_instance;
return s_instance;
}

public:
SingletonGuiApp()
{
m_hFileMapping = NULL;
}

~SingletonGuiApp()
{
Destroy();
}

/**
* 创建唯一实例
*
* @param szUniqueName 应用程序唯一名称,一般可以用GUID
* @param bShowInstance 是否将正在运行的程序实例显示到前台
* @return 如果没有实例在运行,则返回成功,否则返回失败
*/
BOOL Create(LPCTSTR szUniqueName, BOOL bShowInstance = TRUE)
{
if(m_hFileMapping) return FALSE;

// 创建共享内存
m_hFileMapping = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, sizeof(HWND), szUniqueName);

// 实例已经存在
if(m_hFileMapping != NULL && GetLastError() == ERROR_ALREADY_EXISTS)
{
if(bShowInstance)
{
// 将共享内存映射到当前进程
LPVOID pAddr = MapViewOfFile(m_hFileMapping, FILE_MAP_READ, 0, 0, sizeof(HWND));
if(pAddr)
{
// 读取共享内存中的窗口句柄
HWND hWnd = *(HWND*)pAddr;
if(hWnd && IsWindow(hWnd))
{
// 显示将已经存在的窗口实例
WINDOWPLACEMENT wndplc;
GetWindowPlacement(hWnd, &wndplc);
if(wndplc.showCmd == SW_MINIMIZE || wndplc.showCmd == SW_SHOWMINIMIZED
|| wndplc.showCmd == SW_SHOWMINNOACTIVE)
{
//ShowWindow(hWnd, SW_SHOW);
SendMessage(hWnd, WM_SYSCOMMAND, SC_RESTORE, 0);
}
else
{
ShowWindow(hWnd, SW_SHOW);
SetForegroundWindow(hWnd);
}
}
// 释放共享内存映射
UnmapViewOfFile(pAddr);
}
}

// 关闭共享内存句柄
Destroy();
return FALSE;
}

return TRUE;
}

/**
* 释放实例
*/
BOOL Destroy()
{
if(m_hFileMapping)
{
CloseHandle(m_hFileMapping);
m_hFileMapping = NULL;
return TRUE;
}
return FALSE;
}

/**
* 设置主窗口
*/
BOOL SetMainWnd(HWND hWnd)
{
if(m_hFileMapping)
{
// 将共享内存映射到当前进程
LPVOID pAddr = MapViewOfFile(m_hFileMapping, FILE_MAP_WRITE, 0, 0, sizeof(HWND));
if(pAddr)
{
// 将当前主窗口句柄写入共享内存
*(HWND*)pAddr = hWnd;
// 撤销内存映射
UnmapViewOfFile(pAddr);
}
return TRUE;
}

return FALSE;
}

protected:
HANDLE m_hFileMapping;
};
okou0696 2010-04-15
  • 打赏
  • 举报
回复
如果程序已经有实例,则从最小化还原前一个实例窗口或者前置。

这句话,我不是很清楚你想要表达的意思。

是不是检测是否程序已经运行?如果没有运行就打开它?
某某9 2010-04-15
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 kier2 的回复:]

http://blog.chinaunix.net/u1/37538/showart_375262.html
这个里面有只启动一个实例的方法
[/Quote]
帮顶!
z8y8x 2010-04-15
  • 打赏
  • 举报
回复
我来来帮顶的
kier2 2010-04-15
  • 打赏
  • 举报
回复
http://blog.chinaunix.net/u1/37538/showart_375262.html
这个里面有只启动一个实例的方法

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧