为了获取前景窗口的应用程序名称(或应用程序文件的名称),我想将GetActiveWindow与GetWindowModuleFileName一起使用。
我发现了一个与GetWindowText here
相关的类似问题GetWindowText的实现工作正常,但GetWindowModuleFileName只返回visual studio的值(当我在devenv中单击时)所有其他应用程序保持空白。
任何暗示我怎么能找出问题所在?这可能与我的应用程序的权限/安全性有关,查询另一个进程的applicationfilename吗?
编辑:http://support.microsoft.com/?id=228469看起来这在Win> = XP
下不起作用如何获取应用程序文件名?
答案 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);
}