您的位置:首页 > 其它

在VC中实现一次执行一个进程,如果同时打开两个,则报该程序已经运行

2007-10-02 17:43 726 查看
//找到当前已经打开的程序实例

HWND hWnd=NULL;

HANDLE h = GetProp(hWnd,"Your Program Name");

if(hWnd!=NULL)

{

AfxMessageBox("该程序已经运行了!");

::ShowWindow(hWnd,SW_SHOWNORMAL); //激活找到的前一个程序

::SetForegroundWindow(hWnd);

}



::Initinstance()

{

if(OpenMutes(MUTEX_ALL_ACCESS,TRUE,"ABCDEFGH"))

return false;//返回FALSE 直接推出程序自动

CreateMutex(NULL,TRUE,"ABCDEFGH"); //创建 别的程序就无法启动了

}

Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=492172
例2:

int WINAPI WinMain(HINSTANCE hInstance,

HINSTANCE hPrevInstance,

LPSTR lpCmdLine,

int nCmdShow)

{

HANDLE hMutex;

WNDCLASSEX wcex;

MSG msg;

long top, left;

char strmsg[256];

unsigned long BackupSerial;

//---------------------------------------------------------------

// 2重起動防止

hMutex = OpenMutex(MUTEX_ALL_ACCESS, FALSE, DATA_GUARD_MUTEX);

if(hMutex)

{

//if(lpCmdLine)

// DebugOut("WinMain - lpCmdLine = %s", lpCmdLine);

EnumWindows(&FindWindowProc, (LPARAM)lpCmdLine);

CloseHandle(hMutex);

return FALSE;

}

hMutex = CreateMutex(NULL, TRUE, DATA_GUARD_MUTEX);

。。。。。。

}

BOOL CALLBACK FindWindowProc(HWND hWnd, LPARAM lParam)

{

if(GetProp(hWnd, DATA_GUARD_WND))

{

if(lParam)

{

COPYDATASTRUCT cds;

memset(&cds, 0, sizeof(COPYDATASTRUCT));

char * pCmd;

pCmd = (char*)lParam;

DebugOut("FindWindowProc - WM_COPYDATA = %s", pCmd);

cds.cbData = strlen(pCmd) + 1;

cds.lpData = (PVOID)pCmd;

SendMessage(hWnd, WM_COPYDATA, NULL, (LPARAM)&cds);

}

SetForegroundWindow(hWnd);

ShowWindow(hWnd, SW_SHOW);

return FALSE;

}

return TRUE;

}

//---------------------------------------------------------------

// インスタンスの保存

g_hInst = hInstance;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐