替代GetWindowModuleFileName来获取其他进程ApplicationFileName?

时间:2011-03-31 12:38:15

标签: c# windows winapi

为了获取前景窗口的应用程序名称(或应用程序文件的名称),我想将GetActiveWindowGetWindowModuleFileName一起使用。

我发现了一个与GetWindowText here

相关的类似问题

GetWindowText的实现工作正常,但GetWindowModuleFileName只返回visual studio的值(当我在devenv中单击时)所有其他应用程序保持空白。

任何暗示我怎么能找出问题所在?这可能与我的应用程序的权限/安全性有关,查询另一个进程的applicationfilename吗?

编辑:http://support.microsoft.com/?id=228469看起来这在Win> = XP

下不起作用

如何获取应用程序文件名?

3 个答案:

答案 0 :(得分:1)

  

为了获取前景窗口的应用程序名称(或应用程序文件的名称),我想将GetActiveWindow与GetWindowModuleFileName一起使用。

     

...查询另一个进程的applicationfilename ...

在我看来你使用GetActiveWindow()函数的问题。它仅用于从调用线程/进程收集信息。如果调用线程处于非活动状态,则GetActiveWindow返回0;

来自MSDN:

  

GetActiveWindow检索附加到调用线程的消息队列活动窗口的窗口句柄。

尝试使用GetForegroundWindow()函数而不是GetActiveWindow()

答案 1 :(得分:0)

您是否偶然关闭了UAC?

从Vista开始,如果您的代码在另一个进程中触及HWND,则您的进程需要以相同的权限级别运行。

换句话说,如果窗口托管在以管理员身份运行的进程中,您的应用程序也必须以管理员身份运行。

答案 2 :(得分:0)

我找到了一个使用它的解决方法:

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

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

uint processId;
if (GetWindowThreadProcessId(handle, out processId) > 0)
{
    Console.WriteLine(Process.GetProcessById((int)processId).MainModule.FileName);
}