2010-03-11 4 views
2

현재 포커스가있는 현재 프로그램과 파일을 알아야하는 C#의 응용 프로그램을 코딩하고 있습니다.현재 포커스가있는 프로그램/파일 이름 (Windows)

e.e. 현재 프로그램 실행 파일 이름 (예 : "word.exe") 또는 실제 공식 프로그램 이름 (예 : "마이크로 소프트 워드 2007")이며 현재 파일을 반환

string GetProgramNameCurrentlyInFocus() { ... } 
string GetFilenameCurrentlyInFocus() { ... } 

: 내가 좋아하는 기능을 쓰고 싶어 현재 프로그램 (예 : "C : \ Users \ Mat \ Documents \ essay.doc")을 사용하여 사용자가 볼 수 있습니다.

RescueTime 및 SysInternals와 같은 제품은 이러한 작업을 수행 할 수 있으므로 가능합니다. 현재 프로그램 제목에 초점을 맞출 수는 있지만 일부 프로그램에서는 제목에 프로그램 이름이 표시되지 않으므로 충분하지 않습니다.

그래서 누구나 그와 같은 기능을 코딩하는 법을 알고 있습니까? 내가보아야 할 조언이나 장소는 없나요?

참고 : SysInternal을 체크 아웃했는데 여전히 무료이지만 Microsoft에서 구입 한 이후 소스 코드를 더 이상 사용할 수 없습니다.

~ 매트

+0

어떤 sysinternals 도구를 사용 하시겠습니까? 어떤 문서가 현재 임의의 프로그램에서 열려 있는지 확인할 수있는 것은 무엇인지 모르겠습니다. –

+1

메신저 RescueTime이 일부 임의의 인스턴스 (제목/명령 줄에서 읽음)를 제외하고이 작업을 수행하고 있음을 기억하지 못합니다. – GrayWizardx

답변

1

당신은 초점이 현재 창을 얻을 GetForgoundWindow를 사용할 수 있습니다. 어떤 파일이 열려 있는지를 알 수는 없습니다.

1

모두 open handles을 열거 할 수 있습니다. 이렇게하면 파일 이름 (또는 프로세스에 둘 이상의 파일이있을 수 있기 때문에 열려있는 모든 파일)이 표시됩니다.

0

GetForegroundWindow을 원할 경우 응용 프로그램의 기본 모듈을 얻을 수 있습니다 (). 일반적으로이 응용 프로그램이됩니다.

오픈 문서를 찾기 위해 어떤 리소스를 사용하는지 확인할 수는 있지만 매우 수동적 인 프로세스입니다.

+0

매뉴얼뿐만 아니라 오류가 발생하기 쉽고 모든 프로그램마다 다릅니다. – rerun

+1

@Rerun, 동의 함. :)하지만 때로는 우리는 ** 관리자 **가 우리가 그렇게 할 것을 주장합니다. 모든 @Mat이하고있는 몇 가지 특정 앱을 보려고하면 ** 나 ** 모든 앱이 완전히 다른 이야기입니다. – GrayWizardx

+0

예, 몇 가지 선택 프로그램 만 살펴 보겠다. RescueTime의 결과에서 영감을 얻어보다 일반적인 접근 방법이 가능해 보였다. 이러한 의견을 보내 주셔서 감사합니다. 우선 순위가 바뀜에 따라 나중에 코드를보고해야하므로 일주일에 2 번 또는 3 번으로 표시 될 것입니다. –

1
[DllImport("user32.dll")] 
    private static extern IntPtr GetForegroundWindow();/ 
    public static string GetForegroundWindowsName() 
    { 
     Process[] allproc = Process.GetProcesses(); 
     IntPtr ii = GetForegroundWindow(); 
     foreach (Process proc in allproc) 
     { 
      if (ii == proc.MainWindowHandle) 
      { 
       return proc.ProcessName; 
      } 
     } 
     return ""; 
    }