2010-03-11 80 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 ""; 
    }