-1

我知道可以通过函数 ShowWindow(hwnd,SW_HIDE) 隐藏窗口句柄“HWND”,该函数会停用并隐藏窗口。

我想要做的是同时隐藏和激活窗口,我想从窗口中获取数据但同时隐藏它。如何做到这一点?

4

1 回答 1

1

不可能有一个处于活动状态(也称为焦点)的隐藏窗口 ( SW_HIDE) 。不过,这是一件好事,因为如果可以的话,这将是一个巨大的安全风险。用户可能正在输入他们的密码,并无意中将其提供给了一个窃取焦点的隐藏窗口。更不用说让一个不可见的窗口窃取所有输入事件会令人难以置信的混乱。

现在,您可以通过最小化窗口 ( ) 或将其尺寸减小到非常小的位置来模拟隐藏窗口。SW_SHOWMINIMIZED最小化的窗口仍然可以是活动/聚焦窗口;他们的任务栏图标将相应更改以说明这一点。同样,Windows 不在乎您的窗口在屏幕上有多小,它仍然可以处于活动状态/聚焦状态。

一些较旧的应用程序会尝试通过将隐藏窗口移动到非常大的正(或小负)坐标来模拟隐藏窗口,假设窗口总是在屏幕外。当然,一旦 Windows 开始支持多显示器(大约在 Windows 98 时期),这种方法的问题就立即变得明显——那些“不可见”的窗口开始出现在用户位于其左右两侧的附加显示器上。主屏幕。哎呀。

但是,我认为这些方法中的任何一种都不是很好的设计。这就是我通常要求人们解释为什么他们认为他们需要这样做的地方。像这样的问题通常是XY 问题的表现形式,在这里您询问您对问题的想象解决方案,而不是询问如何解决问题本身。你这么说

我想从窗口中获取数据但同时隐藏它

但我不确定这意味着什么。“从窗口获取数据”是什么意思?无论窗口是否处于活动状态,您都可以从窗口“获取数据”。如果您告诉我们您想要获取什么样的数据,我可以建议一种更好的方法来检索数据。但是例如,如果您想从窗口上的文本框控件中检索文本,您可以向文本框控件发送一条WM_GETTEXT消息。其他常见控件也有类似的消息。

唯一需要聚焦窗口的情况是,如果您尝试使用类似于SendInput以编程方式驱动应用程序的目标将鼠标和键盘事件注入输入队列。这是愚蠢的,尤其是因为它的脆弱性。即使您设法让窗口像您想要的那样隐藏和激活,也没有什么可以阻止用户单击其他地方、更改焦点窗口并破坏您精心设置的所有内容。几乎总是有更好的方法来实现 UI 自动化。

于 2013-05-26T08:14:54.633 回答