【发布时间】:2012-09-01 19:05:59
【问题描述】:
我想检查一下这段代码,看看你能不能帮我实现它
如果是这样, 有没有办法查询得更快 以“a”开头的进程和以“b”开头的进程
(是不是用filter参数)
是否可以通过其他方法使用所需的参数来完成
EnumDesktopWindows(IntPtr.Zero, filter, IntPtr.Zero)
我怎样才能调用EnumDesktopWindows() 另一个可能不仅使用本机方法 - 如上所述的过滤...一种“帮助”方法
private const string USER32 = "user32.dll";
internal delegate bool EnumDelegate(IntPtr hWnd, int lParam);
[DllImport(WindowsFunctions.USER32, EntryPoint = "GetWindowText", ExactSpelling = false, CharSet = CharSet.Auto, SetLastError = true)]
internal static extern int GetWindowText(IntPtr hWnd, StringBuilder lpWindowText, int nMaxCount);
[DllImport(WindowsFunctions.USER32)]
[return: MarshalAs(UnmanagedType.Bool)]
internal static extern bool IsWindowVisible(IntPtr hWnd);
[DllImport(WindowsFunctions.USER32)]
internal static extern int GetWindowThreadProcessId(IntPtr hWnd, out int processId);
[DllImport(WindowsFunctions.USER32)]
internal static extern bool EnumDesktopWindows(IntPtr hDesktop, EnumDelegate lpfn, IntPtr lParam);
public class WindowData
{
public string Title { get; set; }
public long ProcessId { get; set; }
public long ThreadId { get; set; }
public IntPtr HWindow { get; set; }
}
var collection = new List<WindowData>();
EnumDelegate filter = delegate(IntPtr hWnd, int lParam)
{
StringBuilder strbTitle = new StringBuilder(255);
int nLength = WindowsFunctions.GetWindowText(hWnd, strbTitle, strbTitle.Capacity + 1);
string strTitle = strbTitle.ToString();
if (IsWindowVisible(hWnd) && !string.IsNullOrEmpty(strTitle))
{
int pid;
int threadId = WindowsFunctions.GetWindowThreadProcessId(hWnd, out pid);
collection.Add(new WindowData()
{
Title = strbTitle.ToString(),
ProcessId = pid,
ThreadId = threadId,
HWindow = hWnd
});
}
return true;
};
if (EnumDesktopWindows(IntPtr.Zero, filter, IntPtr.Zero))
{
return collection.ToArray();
}
return null;
}
【问题讨论】:
-
请提出一个简短而直接的问题。
-
这里真的没有问题。您的问题真的是“我如何执行最终的 sn-p 代码?”如果是这样,请删除所有问题的其余部分并仅提出问题。
-
不完全是,我问的是一种优雅的方式来查询那个“丢失的”hWnd 如何以最巧妙的方法获取它你会使用不安全的代码来获得更多的性能吗?任务,你会选择什么方法,关于我发布的最后一个方法,我认为使用 pinvoke 将完成我提到的工作,优雅而性能优化,如果这个代码(最后一个)可以做到,我想看看如何,但主要问题是你会选择怎么做?
-
我仍然无法理解这一点,仍然看不到真正的问题。对不起。
-
@DavidHeffernan 将其重新精简为一个尽可能短的问题
标签: c# winapi enumeration window-handles