2010-03-11 77 views
2

我正在編寫一個C#中的應用程序,需要知道用戶關注的當前程序和文件。焦點當前程序/文件名(Windows)

I.e.我想寫出這樣的功能:

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

它會返回當前程序可執行文件名(如「word.exe」)或實際的正式節目名(如「微軟的Word 2007」),和當前文件是被用戶用當前程序查看(例如「C:\ Users \ Mat \ Documents \ essay.doc」)。

像RescueTime和SysInternals這樣的產品可以做到這些,所以它是可能的。我可以把當前節目的標題放在焦點上,但這還不夠好,因爲有些節目沒有在節目中說出節目名稱。

那麼,有沒有人知道如何編寫這樣的功能?任何提示或地方我應該看看?

注意:我已經檢出了SysInternal,儘管仍然是免費的,但自從微軟將其購買出去後,源代碼已不再可用。

〜墊

+0

你指的是哪個sysinternals工具?我不知道有什麼可以讓你看到目前在任意程序中打開的文檔。 – 2010-03-11 00:46:07

+1

林不知道我記得RescueTime這樣做或者除了一些任意的實例(它從標題/命令行中讀取它)。 – GrayWizardx 2010-03-11 00:49:10

回答

1

您可以使用GetForgoundWindow來獲得當前窗口的焦點。我不知道一種方法來獲取打開的文件。

1

有可能枚舉全部open handles。這會給出文件的名稱(或者更確切地說,所有打開的文件,因爲進程可能有多個文件)。

0

你想GetForegroundWindow然後從那裏你可以得到應用程序的主要模塊(這將是一般是啓動它的應用程序)。

您可能能夠確定使用哪些資源來查找打開的文檔,但這將是一個高度手動的過程。

+0

不僅手動而且容易出錯,每個程序都有所不同。 – rerun 2010-03-11 01:02:50

+1

@Rerun,同意。 :)但有時我們有**經理**堅持我們做這樣的事情。如果@Mat所做的只是試圖觀看一些特定的應用程序,這可能並不壞,**所有的**應用程序都是完全不同的故事。 – GrayWizardx 2010-03-11 01:21:09

+0

是的,我應該只是觀看一些選擇的節目,但是受RescueTime輸出的啓發,更普遍的方法似乎是可能的。 感謝那些評論,雖然 - 來自所有人的巨大幫助! 因爲優先級已經轉移,所以稍後必須報告我的代碼,因此可能在一週或2 ...或3。 – 2010-03-11 04:20:42

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 ""; 
    }