怎么让我的chm帮助文件只能打开一次,并随程序一起关闭? 我用的是WinExec("hh.exe Help.chm",SW_SHOW);但是可以打开n个帮助文件,而且也不会随程序关闭,谁有经验的帮下忙? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 用CreateProcess并在主程序中记录下它的HANDLE,关闭主程序的时候先介绍它.最好第二次点击帮助菜单的时候,如果帮助文件已经打开就激活它~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~这个用FindWindow,如果找到了就用SetForegroundWindow激活它. 重载OnHelpInfo(HELPINFO* pHelpInfo) /*重载函数:弹出帮助程序*/BOOL CMainFrame::OnHelpInfo(HELPINFO* pHelpInfo) { CString szHelpFile=m_ProDir+"masterhelp.chm"; HWND hwnd =::HtmlHelp(GetDesktopWindow()->m_hWnd ,szHelpFile,HH_DISPLAY_TOPIC,NULL) ; return CFrameWnd::OnHelpInfo(pHelpInfo);}HtmlHelp定义在HtmlHelp.h在Html Help workshop的安装目录下可以找到.同时要把在该文件夹下的help . lib拷贝的你的工程。然后包含进来:#pragma comment(lib,"Htmlhelp.lib") 是不是类似于只让系统中运行一个程序如果是的话,请看下面的回答有两种方法1 进程互斥的方法。当打开第二个程序的时候,不让它打开2 这种方法是打开一个进程以后,再打开的时候把前一个进程关闭,再启动一次本进程代码如下第二种方法如下#define BBB_AX_BX_CX _T("BBB_AX_BX_CX_FILEMAPPING_LDF_51900")在下面加入代码BOOL CBbbApp::InitInstance(){ HANDLE hProcessID = ::OpenFileMapping(FILE_MAP_ALL_ACCESS, TRUE, BBB_AX_BX_CX); LPBYTE lpData = NULL; if(hProcessID != NULL) // 已经有服务在运行了. { lpData = (LPBYTE)::MapViewOfFile(hProcessID, FILE_MAP_ALL_ACCESS, 0, 0, sizeof(DWORD)); DWORD dwID = 0; if(lpData != NULL) { dwID = *((DWORD *)(lpData)); // 得到在运行的进行ID } ::UnmapViewOfFile(lpData); ::CloseHandle(hProcessID); if(dwID != 0) // 通过ID来退出进程 { HANDLE hHandle = NULL; hHandle = ::OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwID); ::TerminateProcess(hHandle, 0); ::WaitForSingleObject(hHandle, INFINITE); ::CloseHandle(hHandle); } } hProcessID = ::CreateFileMapping((HANDLE)0xFFFFFFFF, NULL, PAGE_READWRITE, 0, sizeof(DWORD), BBB_AX_BX_CX); if(hProcessID != NULL) // 创建新的文件映象,保存本进程的ID { lpData = (LPBYTE)::MapViewOfFile(hProcessID, FILE_MAP_ALL_ACCESS, 0, 0, sizeof(DWORD)); if(lpData != NULL) { DWORD dwID = ::GetCurrentProcessId(); memcpy(lpData, &dwID, sizeof(DWORD)); } }}第一种方法就用两句话。忘了,明天早上再来回答第一种方法 看来你用第二种方案是最可行的,当关闭程序的时候就直接用上下面的代码就可以关闭#define FAMILY_PROTECT _T("BBB_AX_BX_CX_FILEMAPPING_LDF_51900")HANDLE hProcessID = ::OpenFileMapping(FILE_MAP_ALL_ACCESS, TRUE,FAMILY_PROTECT); LPBYTE lpData = NULL; if(hProcessID != NULL) { lpData = (LPBYTE)::MapViewOfFile(hProcessID, FILE_MAP_ALL_ACCESS, 0, 0, sizeof(DWORD)); DWORD dwID = 0; if(lpData != NULL) { dwID = *((DWORD *)(lpData)); // 得到在运行的进行ID } ::UnmapViewOfFile(lpData); ::CloseHandle(hProcessID); if(dwID != 0) // 通过ID来退出进程 { HANDLE hHandle = NULL; hHandle = ::OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwID); ::TerminateProcess(hHandle, 0); ::WaitForSingleObject(hHandle, INFINITE); ::CloseHandle(hHandle); } } else { return; } 利用互斥的方式实现系统中只运行一个进程就2行代码加入到BOOL CXXXApp::InitInstance()中 HANDLE m_hMutex=CreateMutex(NULL,TRUE, m_pszAppName); if(GetLastError()==ERROR_ALREADY_EXISTS) { return FALSE; } changlele(梦幻水晶) ,这跟系统中只运行一个进程不太像,因为我是在应用程序里控制帮助文件的打开与否,关闭帮助文件的时候没法通知应用程序我关闭了。 jszj(老板说mis部不是赚钱的部门) ,你这么说我还是不会做,呵呵。我还是菜鸟,能不能给点代码什么的,如果你有空的话。 skyxie(黑白精灵) :我听别人也是这么说的,但是“用CreateProcess并在主程序中记录下它的HANDLE”这个不太明白该怎么做 HWND hwnd = ::FindWindow(类名称,窗口名称);if(hwnd) ::ShowWindow(hwnd,SW_HIDE); 搞定了,其实如果用这个命令的话,就不会有那些问题!::HtmlHelp(NULL, "Help.chm", HH_DISPLAY_TOPIC, 0); 关于宽字符的问题,求教啊 excel 编程 谁有能力开发搜索工具条的进来看看。。。 请问大家vc++中如何实现复制文件夹操作? 怎么学习MFC 请问一下我怎样统计一个数组中分号出现的次数? 谁能告诉我怎样编一个声音采样并显示其波形的程序大概?谢谢您的指点!! 打开了一个程序怎样知道是C编的还是C++编的? 怎样像金山毒霸那样在系统启动后最早运行? 有谁知道消息WM_COPYDATA 的用法,请举例说明. ATL的初级问题 100分请教:用MFC做ACTIVEX控件,怎样才能在IE中用<PARAM>给控件传递参数。 急!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~这个用FindWindow,如果找到了就用SetForegroundWindow激活它.
重载函数:弹出帮助程序
*/
BOOL CMainFrame::OnHelpInfo(HELPINFO* pHelpInfo)
{
CString szHelpFile=m_ProDir+"masterhelp.chm";
HWND hwnd =::HtmlHelp(GetDesktopWindow()->m_hWnd ,szHelpFile,HH_DISPLAY_TOPIC,NULL) ;
return CFrameWnd::OnHelpInfo(pHelpInfo);
}
HtmlHelp定义在HtmlHelp.h
在Html Help workshop的安装目录下可以找到.同时要把在该文件夹下的help . lib拷贝的你的工程。然后包含进来:
#pragma comment(lib,"Htmlhelp.lib")
如果是的话,请看下面的回答有两种方法
1 进程互斥的方法。当打开第二个程序的时候,不让它打开
2 这种方法是打开一个进程以后,再打开的时候把前一个进程关闭,再启动一次本进程代码如下
第二种方法如下#define BBB_AX_BX_CX _T("BBB_AX_BX_CX_FILEMAPPING_LDF_51900")
在下面加入代码
BOOL CBbbApp::InitInstance()
{
HANDLE hProcessID = ::OpenFileMapping(FILE_MAP_ALL_ACCESS, TRUE, BBB_AX_BX_CX);
LPBYTE lpData = NULL;
if(hProcessID != NULL) // 已经有服务在运行了.
{
lpData = (LPBYTE)::MapViewOfFile(hProcessID,
FILE_MAP_ALL_ACCESS, 0, 0, sizeof(DWORD));
DWORD dwID = 0;
if(lpData != NULL)
{
dwID = *((DWORD *)(lpData)); // 得到在运行的进行ID
}
::UnmapViewOfFile(lpData);
::CloseHandle(hProcessID);
if(dwID != 0) // 通过ID来退出进程
{
HANDLE hHandle = NULL;
hHandle = ::OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwID);
::TerminateProcess(hHandle, 0);
::WaitForSingleObject(hHandle, INFINITE);
::CloseHandle(hHandle);
}
}
hProcessID = ::CreateFileMapping((HANDLE)0xFFFFFFFF, NULL, PAGE_READWRITE,
0, sizeof(DWORD), BBB_AX_BX_CX);
if(hProcessID != NULL) // 创建新的文件映象,保存本进程的ID
{
lpData = (LPBYTE)::MapViewOfFile(hProcessID,
FILE_MAP_ALL_ACCESS, 0, 0, sizeof(DWORD));
if(lpData != NULL)
{
DWORD dwID = ::GetCurrentProcessId();
memcpy(lpData, &dwID, sizeof(DWORD));
}
}}第一种方法就用两句话。忘了,
明天早上再来回答第一种方法
#define FAMILY_PROTECT _T("BBB_AX_BX_CX_FILEMAPPING_LDF_51900")
HANDLE hProcessID = ::OpenFileMapping(FILE_MAP_ALL_ACCESS, TRUE,FAMILY_PROTECT);
LPBYTE lpData = NULL; if(hProcessID != NULL)
{
lpData = (LPBYTE)::MapViewOfFile(hProcessID,
FILE_MAP_ALL_ACCESS, 0, 0, sizeof(DWORD));
DWORD dwID = 0;
if(lpData != NULL)
{
dwID = *((DWORD *)(lpData)); // 得到在运行的进行ID
}
::UnmapViewOfFile(lpData);
::CloseHandle(hProcessID);
if(dwID != 0) // 通过ID来退出进程
{
HANDLE hHandle = NULL;
hHandle = ::OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwID);
::TerminateProcess(hHandle, 0);
::WaitForSingleObject(hHandle, INFINITE);
::CloseHandle(hHandle);
}
}
else
{
return;
}
if(GetLastError()==ERROR_ALREADY_EXISTS) { return FALSE; }
if(hwnd)
::ShowWindow(hwnd,SW_HIDE);
::HtmlHelp(NULL, "Help.chm", HH_DISPLAY_TOPIC, 0);