我正在尝试获取活动窗口的名称,如任务管理器应用程序列表中所示(使用 c#)。我遇到了与此处所述相同的问题。我试图按照他们的描述去做,但是我遇到了问题,而重点应用程序是我得到异常的图片库。我也试过这个,但没有给我预期的结果。现在我使用:
IntPtr handle = IntPtr.Zero;
handle = GetForegroundWindow();
const int nChars = 256;
StringBuilder Buff = new StringBuilder(nChars);
if (GetWindowText(handle, Buff, nChars) > 0)
{
windowText = Buff.ToString();
}
Run Code Online (Sandbox Code Playgroud)
并根据我为大多数常见应用程序创建的表删除不相关的内容,但我不喜欢这种解决方法。有没有办法获取所有正在运行的应用程序的任务管理器中的应用程序名称?
我想可以肯定地说 WPF 将其内容呈现为窗口背景。不存在传统 HWND 意义上的子窗口。因此,当人们在 WPF 应用程序中引入基于 HWND 的东西(例如 Web 浏览器)时,视觉外观方面的情况就开始出错。
考虑一个窗口,它有一个带有两个子项的网格、WebBrowser 和其他东西,例如文本框。如果 WebBrowser 是一个红色圆圈,则文本框将呈现在其顶部。对于 WebBrowser,在任何地方都找不到 TextBox。这是因为 TextBox 被渲染为主窗口的背景,而 WebBrowser 实际上是主窗口的 HWND 子窗口,遮挡了背景。
所以一切都(不)很好。一个人如何实现期望的行为?我想让 TextBox 在 WebBrowser 之上呈现。有人遇到过这个问题吗?
我正在考虑拥有第二个透明的顶级无边框 WPF 窗口,重新设置它的父级,以便主窗口拥有它,并执行一些其他技巧来实现它。
在深入研究之前,我想知道是否有人有一个明显或更简单的解决方案?
我向任何可以发布 Ray Burns Answer 实现的人提供此赏金AirRepair。我自己尝试过但没有成功
我有一个DLL,我想使用Direct Sound播放声音.为了播放声音,我需要可执行文件的HWND.我没有加载DLL的可执行文件的HWND.如何在DLL中获取它而不将其从可执行文件中传入?
我有一种情况,当我收到消息时,我必须从hWnd删除一个窗口.我虽然这必须是可能的,因为CreateWindowEx通过返回HWND创建一个对象,我必须能够删除一个.
注意:hWnd取决于其他一些过程.
我们正在 Windows 中构建一个 JavaFX 应用程序,我们希望能够做一些事情来操纵我们的应用程序在 Windows 7/8 任务栏中的显示方式。这需要修改名为“应用程序用户模型 ID ”的 Windows 变量。
我们已经通过使用JNA成功地在 Swing 中完成了我们想要的,我们想在 JavaFX 中重复我们的解决方案。不幸的是,要做到这一点,我们需要能够检索hWnd应用程序中每个窗口的(窗口句柄)。这可以通过 JNA Native.getWindowPointer()方法在 Swing/AWT 中完成,该方法java.awt.Window与javafx.stage.Window.
有没有人知道有什么方法可以获取hWnda Stage?
我正在一个IDE中创建一个hwnd及其各自的IDE WndProc LRESULT CALLBACK.我需要将其更改WndProc为自定义的.
我已经读过SetWindowLong会做的工作,但我找不到任何有效的例子.例如:
HWND hwnd; //My window
SetWindowLong(hwnd, GWL_WNDPROC, myNewWndProc);
第三个参数SetWindowLong是a Long作为函数名称的名称.如何从我的WndProc函数中引用Long?
我的WndProc:
LRESULT CALLBACK WndProcedure(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam){
msg_dev(toString(uMsg));
switch(uMsg){
case WM_MOUSEMOVE:
SetCursor(LoadCursor(NULL, IDC_HAND));
break;
case WM_LBUTTONDOWN:
msg_dev("Button down!");
break;
default:
DefWindowProc(hwnd, uMsg, wParam, lParam);
}
return 0;
};
Run Code Online (Sandbox Code Playgroud) 我现在已经厌倦了研究这个话题。系统中有上百万个 API 来实现部分功能,即枚举所有窗口,但没有涉及如何获取它们的真实 z 顺序。怎么做?让我解释。
首先,当然,要枚举窗口,可以使用EnumWindows或 当它表现不佳并决定不显示 UWP 应用程序时,因为操作系统中存在一些愚蠢的限制,可以直接使用NtUserBuildHwndList无论如何在后端调用的EnumWindows.
这样一来,您就可以在回调中过滤子窗口、隐藏窗口和奇怪的窗口。根据您所做的事情,您会得到不同的结果。为了让您免于阅读,最常见的方法是 Raymond Chen 那种过时的解决方案,或者尝试一些更新的方法,可以更好地过滤 Windows 10+ 中的隐藏窗口,并DwmGetWindowAttribute(hwnd, DWMWA_CLOAKED, &bIsCloaked, sizeof(BOOL));用BOOL bIsCloaked = TRUE;您最终会得到真正的窗口对桌面感兴趣。
唯一的问题是,它们是按 z 顺序排序的。该列表是通过按 z 顺序对每个窗口带中的所有窗口进行排序而形成的,然后将结果连接到最终列表中。现在,什么是窗带?这是一项未记录的微软发明,他们让一些窗口位于更上面的位置HWND_TOPMOST(从安全角度来看是有道理的,但从根本不记录它的意义上来说,这是没有意义的)。您可以在这里阅读相关内容。基本上,桌面上有多个带区,每个带区是一组共享 z 顺序的窗口。然后,将条带堆叠在一起,生成条带的 z 顺序。选中“始终在顶部”的任务管理器在ZBID_SYSTEM_TOOLS上方的带区中运行ZBID_DESKTOP,这就是为什么它始终位于常规应用程序可以创建的任何窗口的顶部。
这是完全有道理的,但用户并不关心窗口带。它会看到桌面上的窗口,当按下 Alt-Tabing 时,它会看到一个按降序排列的列表,从最近使用的窗口到最后使用的窗口。按照这个顺序,尽管有乐队。例如,我的工作流程是 Firefox-Task Manager-cmd,我希望在 Alt-Tab 中看到 cmd-Task Manager-Firefox,尽管任务管理器始终位于顶部。
现在很明显,我们需要以某种方式对这个列表进行排序。出现的问题是,如何不考虑窗口带而按 z 顺序对窗口列表进行排序?我一生都无法在任何地方找到任何有用的东西,无论是在谷歌上,还是在乏善可陈的文档中。GetTopWindow并且GetNextWindow,传统功能比方说,始终将来自其他带的窗口放在第一个位置ZBID_DESKTOP,然后对其余窗口进行正确排序ZBID_DESKTOP。所有旧版 API 的行为就像其他频段中的窗口一样HWND_TOPMOST,这是有道理的。但我不希望这样:仅当我们一起考虑所有频带或所有窗口都在同一频带上时,z 顺序 …
我想用OpenGL在C++中创建一个屏幕保护程序.发送到我的应用程序以在小窗口中预览屏幕保护程序的命令行包含一个数字,它是hwnd屏幕保护程序控制面板小程序中的小监视器窗口.如何将此字符串转换为有效字符串hwnd?
是否有一种方法可以设置侦听器/观察器以了解不相关的应用程序窗口何时关闭?
我可以检查窗口是否仍然打开,但持续这样做似乎很愚蠢。