程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> 程序只運行一個實例,並激活前一個實例

程序只運行一個實例,並激活前一個實例

編輯:關於VC++

示例代碼運行效果圖如下:

實現程序只運行一次的方法很多,但是原理都是一樣的,就是運行第一次的時候設置一個標記,每次運行的時候檢查該標記,如果有就說明已經運行了。

具體實現:

1、在程序初始化的時候 (InitInstance()) 枚舉所有的窗口,查找本程序的實例是否存在

2、在主窗口初始化的時候在本窗口的屬性列表中添加一個標記,以便程序查找.

部分關鍵代碼

1、在App的InitInstance()中枚舉所有窗口,查找本程序實例

HWND oldHWnd = NULL;
EnumWindows(EnumWndProc,(LPARAM)&oldHWnd);  //枚舉所有運行的窗口
if(oldHWnd != NULL)
{
  AfxMessageBox("本程序已經在運行了");
  ::ShowWindow(oldHWnd,SW_SHOWNORMAL);  //激活找到的前一個程序
  ::SetForegroundWindow(oldHWnd);  //把它設為前景窗口
  return false;  //退出本次運行
}

2、添加EnumWndProc窗口過程函數:

//添加的標識只運行一次的屬性名
CString g_szPropName = "Your Prop Name";  //自己定義一個屬性名
HANDLE  g_hValue = (HANDLE)1;  //自己定義一個屬性值
BOOL CALLBACK EnumWndProc(HWND hwnd,LPARAM lParam)
{
  HANDLE h = GetProp(hwnd,g_szPropName);
  if( h == g_hValue)
  {
    *(HWND*)lParam = hwnd;
    return false;
  }
  return true;
}

3、在主窗口的 OnInitDialog()中添加屬性

//設置窗口屬性
SetProp(m_hWnd,g_szPropName,g_hValue);

本文配套源碼

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved