gpt4 book ai didi

C# GetForegroundWindow() 为多个窗口返回相同的结果,EnumWindows 根本不返回那个 #

转载 作者:行者123 更新时间:2023-11-30 18:35:30 25 4
gpt4 key购买 nike

C# 的 GetForegroundWindow() 为多个窗口返回相同的结果,EnumWindows 根本不返回那个窗口。每个进程实际上都有自己的层。

我还检查了两个 GetWindowThreadProcessId() 函数并使用 GetChildWindows() 枚举了它们,但它们仍然没有返回与GetForegroundWindow()

如何正确地从 GetForegroundWindow() 开始并将其转换为您从适当的 EnumWindows 中检索的内容?

目标:GetForegroundWindow + 正确枚举以检索正确的顶级句柄(chrome 中的所有选项卡,您的项目表单),但不必在困惑中筛选 GetAllWindows( ) 带给你。谢谢。

private ArrayList GetAllWindows()
{
var windowHandles = new ArrayList();
EnumedWindow callBackPtr = GetWindowHandle;
EnumWindows(callBackPtr, windowHandles);

foreach (IntPtr windowHandle in windowHandles.ToArray())
{
EnumChildWindows(windowHandle, callBackPtr, windowHandles);
}

return windowHandles;
}

private delegate bool EnumedWindow(IntPtr handleWindow, ArrayList handles);

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool EnumWindows(EnumedWindow lpEnumFunc, ArrayList lParam);

[DllImport("user32")]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool EnumChildWindows(IntPtr window, EnumedWindow callback, ArrayList lParam);

List<IntPtr> ids = new List<IntPtr>();

private bool GetWindowHandle(IntPtr windowHandle, ArrayList windowHandles)
{
windowHandles.Add(windowHandle);
listBox1.Items.Add(windowHandle);
//ids.Add(GetWindowThreadProcessId(windowHandle, IntPtr.Zero));
return true;
}

最佳答案

这是我在 Windows 中用于 C++ 的内容:

TCHAR buf[255];    
HWND foregroundWindow = GetForegroundWindow();
DWORD* processID = new DWORD;
GetWindowText(foregroundWindow, buf, 255);
GetWindowThreadProcessId(foregroundWindow, processID);
DWORD p = *processID;
HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION |
PROCESS_VM_READ,
FALSE, p);
TCHAR szProcessName[MAX_PATH];

if (NULL != hProcess )
{
HMODULE hMod;
DWORD cbNeeded;

if ( EnumProcessModules( hProcess, &hMod, sizeof(hMod),
&cbNeeded) )
{
GetModuleBaseName( hProcess, hMod, szProcessName,
sizeof(szProcessName)/sizeof(TCHAR) );
}
}
CloseHandle(hProcess);
long pid = (long)p;

我知道您的应用程序是 C#,但您或许可以使用其中一些 Windows API 调用来获取所需的信息。如果我能做些什么来进一步解释代码,请告诉我。

关于C# GetForegroundWindow() 为多个窗口返回相同的结果,EnumWindows 根本不返回那个 #,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15061766/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com