问题标签 [user32]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
2180 浏览

c# - 如何获取应用程序的活动 ChildWindow?

我有这个问题:我有一个特定应用程序的主窗口的处理程序,我想在那个应用程序上模拟一个按键......

我正在使用 sendMessage/postMessage api 调用来执行此操作。我不使用 .Net SendKeys 函数或 win32 api 的 keybd_event 的原因是它们在全局级别模拟按键。在我的情况下,目标应用程序不是最活跃的应用程序(其他应用程序可能运行在更高的 z 级别,因此覆盖了目标应用程序)。

sendMessage 和 postMessage 的问题在于,您必须传递要按下键的确切子窗口的处理程序。例如,在记事本中,如果我将密钥发送到主窗口的处理程序,什么也没有发生,我必须将密钥发送到子窗口的处理程序,该子窗口基本上由您可以编写的白色画布组成。

获取活动子窗口的处理程序是问题所在。一开始,我使用 GetTopWindow 或 GetWindow(GW_CHILD) api 调用,因为它返回最活跃的子窗口。我正在做的是继续调用 GetWindow(GW_CHILD),直到我得到一个没有更多 childWindows 的 childwindow。这适用于记事本或绘画等某些应用程序。但是,在某些情况下(例如 Firefox),它不起作用。原因是父窗口有整个firefox区域,而它的子窗口有打开的网页(如google)。所以,当我询问主窗口最活跃的子窗口时,它返回它拥有的唯一子窗口,也就是网页区域对应的那个。它仅在活动窗口是那个窗口时才有效(例如,如果用户在某个页面的文本框上写东西)。

我实际上找到了一种方法,使用 GetGUIThreadInfo api调用,使用以下代码:

而且效果很好:如果地址栏处于活动状态,它会向地址栏发送一个“W”字母。如果谷歌的搜索文本框处于活动状态,它会向它发送“W”字母......完美!但是,我不能使用这种方法,原因很简单:如果目标应用程序不是操作系统的活动窗口,则 ThreadInfo 结构为空。例如,如果我的目标是 firefox,如果 firefox 处于活动状态(最顶层的应用程序,聚焦/活动的应用程序),它就可以工作,但是如果,比如说,记事本位于 firefox 之上,它就不起作用,它无法获取活动窗口处理程序。

我知道我可以通过使用 setForegroundWindow api 调用来激活目标应用程序然后捕获活动子窗口的处理程序来解决这个问题,但我不想将目标应用程序带到前台。

我还尝试了其他技术,例如 AttachThreadInput() 和 GetFocus() api 调用,它们也可以工作,但有同样的问题:如果目标应用程序不是活动的 Windows 应用程序,它就不起作用。

所以基本上我需要找到某种方法将处理程序获取到应用程序的活动子窗口,即使该应用程序不是最活跃的应用程序。

有任何想法吗?谢谢

0 投票
2 回答
3461 浏览

c# - 如何获取应用程序的活动 ChildWindow?

我想向某个不是 Windows 中的活动应用程序的应用程序发送一个 pressKey 事件,所以我必须使用 sendMessage/postMessage api 调用。

但是,我需要知道在应用程序中处于活动状态的确切子窗口并向其发送 pressKey 消息...

我正在使用 GetTopWindow 和 GetWindow(GW_CHILD) api调用来获取主窗口的顶部子窗口,并使用获得的子窗口再次执行以获取顶部的孙子窗口,并继续这样做直到我找到一个没有更多子窗口的子窗口. 这对某些应用程序非常有用,但在某些情况下则不然。有时父窗口是活动窗口,而不是其子窗口之一,因此获取父窗口的顶部子窗口将不起作用,因为我将向错误的窗口发送消息。

我发现这样做的唯一方法(获取实际活动窗口的处理程序)是使用 GuiThreadInfo api 调用,但它仅在目标应用程序是 Windows 中的活动应用程序时才有效。正如我在开头提到的那样,处理程序并非如此。

我可以使用 setForegroundWindow api 调用将应用程序置于顶部,但我不想这样做。我还尝试了 AttachThreadInput 和 GetFocus api 调用,但同样,它们仅在目标应用程序是 Windows 中的活动应用程序时才有效。

有任何想法吗?谢谢

0 投票
2 回答
353 浏览

windows - 如何获得最小化窗口的恢复边界?

很容易获得屏幕上所有可见窗口的边界矩形。判断任何窗口是否具有标志性也很容易。

但是对于最小化的窗口,从 User32.GetWindowInfo.rcWindow 报告的 Top 和 Left 为 -32000。我查看了整个 API,找不到返回如果单击或切换到窗口将恢复到的边界的调用。

感谢您的任何指示。

0 投票
5 回答
7806 浏览

winapi - 在 Win32 上创建新窗口时如何通知我?

有没有办法使用 Win32 在创建新窗口时注册通知。我正在尝试保留当前打开的窗口列表,但现在只是使用EnumWindows().

有人做过类似的事情吗?

谢谢


我不确定我这样做是否正确,但我无法触发 SetWindowsHookEx 方法。

有什么想起来的吗​​?

这是我的片段

0 投票
3 回答
5139 浏览

.net - 更改单个应用程序的系统颜色(Windows、.NET)

我知道我通常应该避免弄乱这样的系统设置,但是我的应用程序确实已经使用了非标准颜色,我对此没有影响。我希望能够在某些地方添加标准的 .NET 控件,但它们的颜色不匹配。我想要一个 hack 来替换这个应用程序的系统颜色。需要注意的另一件重要的事情是它是一个 .NET 应用程序。

到目前为止,我的(不完整的)想法是:

  • 用替换的 GetSysColor 创建一个代理 User32.dll 库,但这会非常繁琐(要重定向 731 个函数,要替换 1 个函数),而且我不知道如何强制我的应用程序使用该特定副本。
  • 以某种方式拦截对 GetSysColors 的调用(不幸的是,我认为它位于 CLR 中的某个位置)。
  • 以某种方式修改 .NET 类 SystemColors(在内存中?可能吗?)。

你有什么想法,实现这一目标的最佳(和完整)方法是什么?

0 投票
1 回答
446 浏览

.net - 如何隐藏标题栏并锁定我在 ac# 形式的面板内移动的 exe(非托管代码)上的位置?

我必须在 .net windows 窗体的面板中“嵌入”一个 .exe。我正在使用 user32.dll SetParent 将启动的应用程序的父级设置为表单面板句柄。

一旦完成,我想

  1. 隐藏.exe的标题栏
  2. 将 exe 锁定在面板中(最大化),使其无法移动或关闭。

建议?

0 投票
2 回答
1804 浏览

c# - GetIconInfo 功能无法正常工作

GetIconInfo我已经编写了一个应用程序,它使用的函数获取当前光标的图标信息user32.dll,它可以正常工作一段时间,但一段时间后它开始在ICONINFO.hbmMask(一些负值)中提供错误信息,并且在下一行我尝试从 中获取 Bitmap 对象Bitmap.HBitmap(bitmask),它会抛出异常:

从那里开始,它不断地给出这个异常,因为GetIconInfo总是返回负值(所有这些代码都在循环中工作)..

谁能告诉我这个问题是什么?以及如何避免下一次迭代异常?

这是代码

0 投票
1 回答
1421 浏览

.net - 使用 User32 (vb .net) 启用对另一个应用程序的控制

我想知道 user32 中是否有一个函数可以启用 hwnd 控件,如果它被禁用(灰色)如果我知道句柄,那么我可以这样做吗?另外,如果是菜单项,也可以吗?

谢谢

0 投票
4 回答
4033 浏览

c# - 如何关闭窗口的 WS_CAPTION 样式(使用 user32.dll)?

我将第 3 方应用程序嵌入到 C# Windows 窗体上的面板中(使用SetParent来自 user32.dll)。然后我需要关闭标题栏窗口样式WS_CAPTION,使其看起来像托管应用程序的一部分。

如何更改窗口的样式以实现此目的?

例如,说_hWnd是要嵌入的应用程序的句柄。

0 投票
1 回答
1888 浏览

c# - 在 windows.forms 面板中“停靠”第三方运行应用程序的更好方法?

我目前这样做如下:



我在使用此代码时遇到的问题是,一旦我更改 MainWindowHandle(即:按钮缺少文本),应用程序 UI 的某些部分将不再正常工作。

有没有办法做到这一点而不会导致停靠的应用程序出现问题?(通过 .net 或 user32)?