应用鼠标双击对应后缀名的文件在如何在已经打开的程序中显示? 现在我的程序已经实现了鼠标在双击对应的文件类型时调用我的应用程序来打开,但是现在的问题是每每双击对应的文件都要另开一个程序,我要怎样做到如果程序在打开的状态时,直接在已经打开的程序中显示鼠标双击的文件,而不是在另外打开一个程序?这得用到怎样的技术啊,刚刚接触没有什么思路! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 检测到有打开的相同的进程的时候(带名字的mutex或者semaphore都可以),检测之前主窗口,发送消息把文件名发过去,关闭。原来的那个收到消息后打开相应的文件............. 就是象explore一样,不太好搞。 我原来做个一个类似的,你可以试试//(1)注册消息#define UNIQUEAPP _T("UNIQUEAPP")static const UINT UWM_UNIQUEAPP = ::RegisterWindowMessage(UNIQUEAPP); //(2)在CMainFrame中处理UWM_UNIQUEAPP消息//.hafx_msg LRESULT OnUniqueApp(WPARAM wParam, LPARAM lParam);//.cppON_REGISTERED_MESSAGE(UWM_UNIQUEAPP, OnUniqueApp) LRESULT CMainFrame::OnUniqueApp(WPARAM wParam, LPARAM lParam){ return UWM_UNIQUEAPP;}//(3)只运行一个实例,并找到已存在的实例BOOL CXXXApp::InitInstance(){ //...... BOOL bExist = FALSE; HANDLE hMutex = CreateMutex(NULL, FALSE, UNIQUEAPP); bExist = ( ::GetLastError() == ERROR_ALREADY_EXISTS || ::GetLastError() == ERROR_ACCESS_DENIED); if (bExist) { HWND hOther = NULL; EnumWindows(SearchExist, (LPARAM)&hOther); if ( hOther != NULL ) { ::SetForegroundWindow(hOther); if (IsIconic(hOther)) ::ShowWindow(hOther, SW_RESTORE); if (IsWindowVisible(hOther) == FALSE) ::ShowWindow(hOther, SW_SHOW); CString strFile = m_lpCmdLine; if (!strFile.IsEmpty()) { //使用WM_COPYDATA向已存在的实例发送要打开的文件 DWORD dwResult; strFile.Remove('\"'); COPYDATASTRUCT cpds; cpds.cbData = strFile.GetLength()*sizeof(TCHAR); cpds.lpData = strFile.GetBuffer(0); cpds.dwData = reinterpret_cast<DWORD>(UNIQUEAPP); ::SendMessageTimeout(hOther, WM_COPYDATA, 0, (LPARAM)&cpds, SMTO_BLOCK|SMTO_ABORTIFHUNG, 200, &dwResult); } } return FALSE; } //......}BOOL CALLBACK CXXXApp::SearchExist(HWND hWnd, LPARAM lParam){ DWORD dwResult; LRESULT lResult = ::SendMessageTimeout(hWnd, UWM_UNIQUEAPP, 0, 0, SMTO_BLOCK|SMTO_ABORTIFHUNG, 200, &dwResult); if(lResult == 0) return TRUE; // ignore this and continue if(dwResult == UWM_UNIQUEAPP) { /*找到之前运行的实例*/ HWND* target = (HWND*)lParam; *target = hWnd; return FALSE; } return TRUE;}//(4)已存在的实例处理WM_COPYDATA消息BOOL CMainFrame::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct) { if (pCopyDataStruct != NULL) { if (lstrcmpi(UNIQUEAPP, reinterpret_cast<LPCTSTR>(pCopyDataStruct->dwData)) == 0) { TCHAR szFile[MAX_PATH+1] = {0}; int nLen = (pCopyDataStruct->cbData > MAX_PATH)?MAX_PATH:pCopyDataStruct->cbData; ::CopyMemory(szFile, pCopyDataStruct->lpData, nLen); TRACE(_T("通过COPYDATA得到的文件路径名%s"), szFile); if (lstrlen(szFile) > 0) { //打开文件 } } } return CFrameWnd::OnCopyData(pWnd, pCopyDataStruct);} 图片点击获得选取颜色 关于网络函数WNetAddConnection2系列 getprivateprofilestring,急求 属性表提问 这个是什么意思?unsigned long int version:2 怎么获取一个进程所占用的内存的大小 晕。。。请教这句代码什么意思??? 关于在在windows程序中加入子窗口的问题。用到WS_CHILDWINDOW MFC 程序一定时间内自动卡死变白后重启 VC写的局域网搜索工具,多提宝贵意见,每个意见都有分。 VC2005 按Alt+F5为什么不能重新生成可执行文件了? 动态改变单文档工具条提示
原来的那个收到消息后打开相应的文件.............
#define UNIQUEAPP _T("UNIQUEAPP")
static const UINT UWM_UNIQUEAPP = ::RegisterWindowMessage(UNIQUEAPP);
//(2)在CMainFrame中处理UWM_UNIQUEAPP消息
//.h
afx_msg LRESULT OnUniqueApp(WPARAM wParam, LPARAM lParam);
//.cpp
ON_REGISTERED_MESSAGE(UWM_UNIQUEAPP, OnUniqueApp)
LRESULT CMainFrame::OnUniqueApp(WPARAM wParam, LPARAM lParam)
{
return UWM_UNIQUEAPP;
}//(3)只运行一个实例,并找到已存在的实例
BOOL CXXXApp::InitInstance()
{
//......
BOOL bExist = FALSE;
HANDLE hMutex = CreateMutex(NULL, FALSE, UNIQUEAPP);
bExist = ( ::GetLastError() == ERROR_ALREADY_EXISTS ||
::GetLastError() == ERROR_ACCESS_DENIED);
if (bExist)
{
HWND hOther = NULL;
EnumWindows(SearchExist, (LPARAM)&hOther);
if ( hOther != NULL )
{
::SetForegroundWindow(hOther);
if (IsIconic(hOther))
::ShowWindow(hOther, SW_RESTORE);
if (IsWindowVisible(hOther) == FALSE)
::ShowWindow(hOther, SW_SHOW); CString strFile = m_lpCmdLine;
if (!strFile.IsEmpty())
{
//使用WM_COPYDATA向已存在的实例发送要打开的文件
DWORD dwResult;
strFile.Remove('\"');
COPYDATASTRUCT cpds;
cpds.cbData = strFile.GetLength()*sizeof(TCHAR);
cpds.lpData = strFile.GetBuffer(0);
cpds.dwData = reinterpret_cast<DWORD>(UNIQUEAPP);
::SendMessageTimeout(hOther,
WM_COPYDATA, 0, (LPARAM)&cpds,
SMTO_BLOCK|SMTO_ABORTIFHUNG,
200,
&dwResult);
}
}
return FALSE;
} //......
}BOOL CALLBACK CXXXApp::SearchExist(HWND hWnd, LPARAM lParam)
{
DWORD dwResult;
LRESULT lResult = ::SendMessageTimeout(hWnd,
UWM_UNIQUEAPP,
0, 0,
SMTO_BLOCK|SMTO_ABORTIFHUNG,
200,
&dwResult);
if(lResult == 0)
return TRUE; // ignore this and continue
if(dwResult == UWM_UNIQUEAPP)
{
/*找到之前运行的实例*/
HWND* target = (HWND*)lParam;
*target = hWnd;
return FALSE;
}
return TRUE;
}//(4)已存在的实例处理WM_COPYDATA消息
BOOL CMainFrame::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)
{
if (pCopyDataStruct != NULL)
{
if (lstrcmpi(UNIQUEAPP, reinterpret_cast<LPCTSTR>(pCopyDataStruct->dwData)) == 0)
{
TCHAR szFile[MAX_PATH+1] = {0};
int nLen = (pCopyDataStruct->cbData > MAX_PATH)?MAX_PATH:pCopyDataStruct->cbData;
::CopyMemory(szFile, pCopyDataStruct->lpData, nLen);
TRACE(_T("通过COPYDATA得到的文件路径名%s"), szFile);
if (lstrlen(szFile) > 0)
{
//打开文件
}
}
}
return CFrameWnd::OnCopyData(pWnd, pCopyDataStruct);
}