2013-02-06 62 views
1

在Visual C++中,我越來越用獲取ProcessName從Visual C++

::GetWindowText(wnd, str, 290); 

strcpy(curr_wnd_txt, str); 

的當前窗口的標題,但我怎樣才能獲得例如「Iexplore在」應用程序的進程名稱爲使用Internet Explorer「 Skype「窗口與瓦片」Skype - 用戶名「,」資源管理器「使用Windows資源管理器?

這是我的嘗試:

void CMainWndDlg::Monitor_ActiveWindowCaptions() 
{ 
    HWND hwnd; 
    DWORD process_id=0; 
    GetWindowThreadProcessId(hwnd, &process_id); 
    CString strEXEName = GetEXEName (process_id); 
} 

CString GetEXEName(DWORD dwProcessID) 
{ 
DWORD aProcesses [1024], cbNeeded, cProcesses; 
unsigned int i; 

if (!EnumProcesses(aProcesses, sizeof(aProcesses), &cbNeeded)) 
    return ""; 

cProcesses = cbNeeded/sizeof(DWORD); 

TCHAR szEXEName[MAX_PATH]; 
for (i = 0; i < cProcesses; i++) 
{ 
    if (aProcesses [i] == dwProcessID) 
    { 
     HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | 
          PROCESS_VM_READ, FALSE, dwProcessID); 
     if (NULL != hProcess) 
     { 
      HMODULE hMod; 
      DWORD cbNeeded; 
      if(EnumProcessModules(hProcess, &hMod, 
            sizeof(hMod), &cbNeeded)) 
      { 
       GetModuleBaseName(hProcess, hMod, szEXEName, 
        sizeof(szEXEName)/sizeof(TCHAR)); 
       return CString (szEXEName); 
      } 
     } 
    }  
} 
return ""; 
} 
+0

你不能。連微軟都沒有。只需啓動IE和任務管理器。在「任務」選項卡中顯示IE的標題(=網頁標題),在「進程」中顯示IExplore.exe。 – MSalters

+0

多數民衆贊成我需要。如果我可以像iexplorer.exe那樣獲取進程,那麼我可以很容易地將它顯示爲iexplorer – user1441251

回答

1

GetModuleFileName()可以用來查詢當前進程的可執行文件的路徑。

http://msdn.microsoft.com/en-gb/library/windows/desktop/ms683197(v=vs.85).aspx

+0

這可能不是這裏所要求的。它從窗口標題獲得可執行文件的名稱 –

+0

@Aniket:可能,也許我應該評論這個問題,並得到一些澄清。看看你的答案是有用的:我不知道GetModuleBaseName()。 –

0

你將不得不枚舉窗口,獲取進程句柄,然後得到下面的函數中的可執行的名稱。

#include "psapi.h" 
#pragma comment(lib, "psapi.lib") 

CString GetEXEName(DWORD dwProcessID) 
{ 
    DWORD aProcesses [1024], cbNeeded, cProcesses; 
    unsigned int i; 

    //Enumerate all processes 
    if (!EnumProcesses(aProcesses, sizeof(aProcesses), &cbNeeded)) 
     return NULL; 

    // Calculate how many process identifiers were returned. 
    cProcesses = cbNeeded/sizeof(DWORD); 

    TCHAR szEXEName[MAX_PATH]; 
    //Loop through all process to find the one that matches 
    //the one we are looking for 
    for (i = 0; i < cProcesses; i++) 
    { 
     if (aProcesses [i] == dwProcessID) 
     { 
      // Get a handle to the process 
      HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | 
           PROCESS_VM_READ, FALSE, dwProcessID); 

      // Get the process name 
      if (NULL != hProcess) 
      { 
       HMODULE hMod; 
       DWORD cbNeeded; 

       if(EnumProcessModules(hProcess, &hMod, 
             sizeof(hMod), &cbNeeded)) 
       { 
        //Get the name of the exe file 
        GetModuleBaseName(hProcess, hMod, szEXEName, 
         sizeof(szEXEName)/sizeof(TCHAR)); 

        return CString (szEXEName); 
       } 
      } 
     }  
    } 

    return NULL; 
} 

參考這裏:http://www.codeproject.com/Articles/14843/Finding-module-name-from-the-window-handle

+0

非常感謝。我會試試這個 – user1441251

+0

Am得到錯誤在「返回NULL」 - 多個構造函數適用於從int轉換爲cstring – user1441251

+0

@ user1441251而不是返回'NULL'您可以返回'「」''。我發佈的代碼用C編譯,但由於C++的嚴格類型檢查,編譯器會抱怨它。 –