2014-03-05 1 views
4

작업 관리자 응용 프로그램 목록 (C# 사용)에 표시된대로 활성 창 이름을 가져 오려고합니다. here과 동일한 문제가 있습니다. 설명대로 시도했지만 초점이 맞춰진 응용 프로그램이 예외적 인 그림 라이브러리 인 동안 문제가 있습니다. 나는 또한 this을 시도했지만 나에게 내가 기대하는 결과를주지 못했습니다.작업 관리자에 표시된대로 활성 창 응용 프로그램 이름을 얻는 방법

IntPtr handle = IntPtr.Zero; 
handle = GetForegroundWindow(); 

const int nChars = 256; 
StringBuilder Buff = new StringBuilder(nChars); 
if (GetWindowText(handle, Buff, nChars) > 0) 
{ 
    windowText = Buff.ToString(); 
} 

을 내가 가장 일반적인 응용 프로그램을 위해 만든 테이블을 기반으로 관련이없는 것을 삭제,하지만 난이 해결 방법을 좋아하지 않는다 : 는 지금 내가 사용합니다. 실행중인 모든 앱에 대한 작업 관리자에서와 같이 앱 이름을 가져 오는 방법이 있습니까?

+0

정확히 달성하려는 것은 무엇입니까? 활성 창의 창 제목이나 실행중인 프로세스 이름의 목록을 가져 옵니까? –

+0

활성 창에 대한 창 제목은 표시되지만 전체 이름은 아니지만 작업 관리자에 나타나는 짧은 이름이 표시됩니다. 참고 링크를 클릭하면 – eskadi

답변

4

많은 것을 읽은 후, 필자는 코드를 두 가지 경우로 구분했습니다. 대도시 응용 프로그램 및 다른 모든 응용 프로그램에 대한 것입니다. 내 솔루션 메트로 응용 프로그램 및 예외에 대한 예외 처리 플랫폼에 관한있어. 이것은 마지막으로 작동 한 코드입니다.

[DllImport("user32.dll")] 
public static extern IntPtr GetForegroundWindow(); 

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString, int nMaxCount); 

[DllImport("user32.dll")] 
static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId); 

public string GetActiveWindowTitle() 
{ 
    var handle = GetForegroundWindow(); 
    string fileName = ""; 
    string name = ""; 
    uint pid = 0; 
    GetWindowThreadProcessId(handle, out pid); 

    Process p = Process.GetProcessById((int)pid); 
    var processname = p.ProcessName; 

    switch (processname) 
    { 
     case "explorer": //metro processes 
     case "WWAHost": 
      name = GetTitle(handle); 
      return name; 
     default: 
      break; 
    } 
    string wmiQuery = string.Format("SELECT ProcessId, ExecutablePath FROM Win32_Process WHERE ProcessId LIKE '{0}'", pid.ToString()); 
    var pro = new ManagementObjectSearcher(wmiQuery).Get().Cast<ManagementObject>().FirstOrDefault(); 
    fileName = (string)pro["ExecutablePath"]; 
    // Get the file version 
    FileVersionInfo myFileVersionInfo = FileVersionInfo.GetVersionInfo(fileName); 
    // Get the file description 
    name = myFileVersionInfo.FileDescription; 
    if (name == "") 
     name = GetTitle(handle); 

return name; 
} 

public string GetTitle(IntPtr handle) 
{ 
string windowText = ""; 
    const int nChars = 256; 
    StringBuilder Buff = new StringBuilder(nChars); 
    if (GetWindowText(handle, Buff, nChars) > 0) 
    { 
     windowText = Buff.ToString(); 
    } 
    return windowText; 
} 
0

각 최상위 창 (바탕 화면 창의 직접 자식, pinvoke http://msdn.microsoft.com/en-us/library/windows/desktop/ms633497(v=vs.85).aspx을 통해 EnumWindows 사용)을 통과해야하며 GetWindowText pinvoke 함수를 호출해야합니다.

EnumWindows는 각 창에 핸들을 차례로 응용 프로그램 정의 콜백 함수로 전달하여 화면의 모든 최상위 창을 열거합니다. '

+0

가 표시됩니다. 참고 Windows 8 이상에서는 EnumWindows가 데스크톱 앱의 최상위 창만 열거합니다. 나는 win8에서 일하고 있으며 메트로 앱 이름도 필요합니다. – eskadi

+0

GetWindow를 사용할 수는 있지만 메트로 앱을 사용하지 않았으므로 확실히 말할 수는 없습니다. –