允许后台应用程序设置不同进程的前台窗口

2024-01-08

首先,我知道这是一个有争议的讨论,但我希望我们能够保持技术性。

我有一个在后台启动的应用程序,我希望它能够在不同的进程中激活/聚焦窗口。但是,即使我要激活其窗口的进程已调用AllowSetForegroundWindow(ASFW_ANY),调用SetForegroundWindow也总是会失败。

原因是(IMO)启动应用程序是后台进程,并且由于它尚未收到输入,因此不允许设置前台窗口。因此,所有内容都会显示在任务列表中,但不会显示。

所以我尝试创建一个虚拟窗口来接收立即关闭的输入然后能够成功调用SetForegroundWindow。但即使是我显示的虚拟窗口也会显示在背景中。

However,如果我打电话

AttachThreadInput(
    GetWindowThreadProcessId(GetForegroundWindow(), NULL),
    GetCurrentThreadId(), TRUE);

在创建虚拟窗口之前,该窗口确实是在前台创建的,我可以然后在不同的进程中为不同的 HWND 调用 SetForegroundWindow 是可行的。

但是:如果我不创建虚拟窗口,尽管我使用 AttachThreadInput,SetForegroundWindow 仍然返回零。

我不明白为什么如果我创建自己的窗口,AttachThreadInput hack 会成功(之后其他窗口也会成功),但如果我不先创建自己的窗口,那么 AttachThreadInput hack 就会失败。

我的后台进程如何在不同进程中的不同窗口上调用 SetForegroundWindowwithout创建一个虚拟窗口?

[*] 后台应用程序实际上是 gpg-agent.exe,每当请求密码时,它就会调用 pinentry.exe(我的应用程序)。 pinentry.exe(作为后台进程运行)必须从另一个正在运行的应用程序请求密码,因此它必须将其窗口带到前台......


The 文档 http://msdn.microsoft.com/en-us/library/windows/desktop/ms681956.aspx for AttachThreadInput()给你一个线索:

在不同线程中创建的窗口通常彼此独立地处理输入。也就是说,它们有自己的输入状态(焦点、活动、捕获窗口、按键状态、队列状态等),并且它们的输入处理与其他线程的输入处理不同步。通过使用 AttachThreadInput 函数,线程可以将其输入处理机制附加到另一个线程。两个线程接收到的键盘和鼠标事件均由 idAttachTo 参数指定的线程处理,直到通过再次调用 AttachThreadInput 并为 fAttach 参数指定 FALSE 来分离线程。这还允许线程共享其输入状态,因此它们可以调用 SetFocus 函数将键盘焦点设置到不同线程的窗口。这也允许线程获取关键状态信息。

The 文档 http://msdn.microsoft.com/en-us/library/windows/desktop/ms633539.aspx for SetForegroundWindow()告诉您调用进程需要满足什么标准才能设置前台窗口:

系统限制哪些进程可以设置前台窗口。仅当满足以下条件之一时,进程才能设置前台窗口:

该进程是前台进程。
该进程是由前台进程启动的。
该进程接收到最后一个输入事件。
没有前台进程。
进程正在调试中。
前台进程不是现代应用程序或开始屏幕。
前景未锁定(请参阅LockSetForegroundWindow)。
前台锁定超时已过期(请参阅 SystemParametersInfo 中的 SPI_GETFOREGROUNDLOCKTIMEOUT)。
没有菜单处于活动状态。

简单地创建一个虚拟窗口本身并不能保证您将成为前台进程。将窗口的线程附加到当前前台窗口的线程允许您共享其输入状态,这使您有更好的机会获得设置前台窗口的权限(如果前台线程有权这样做)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

允许后台应用程序设置不同进程的前台窗口 的相关文章

  • 检查Windows电源管理是否关闭了显示器

    如何在 Windows 7 和 XP 中以编程方式检查 Windows 电源管理 是否已关闭显示屏 如果能收到一个活动就更好了 我不认为 XP 可以做到这一点 Windows 7 中有各种与电源管理相关的好东西 这Windows API 代
  • 初始化 LPCTSTR /LPCWSTR [重复]

    这个问题在这里已经有答案了 我很难理解并使其正常工作 基本上归结为我无法成功初始化这种类型的变量 它需要有说的内容7 2E25DC9D 0 USB003 有人可以解释 展示这种类型的正确初始化和类似的值吗 我已查看此站点上的所有帮助 将项目
  • C# 如何使用 CallNtPowerInformation 和 Interop 来获取 SYSTEM_POWER_INFORMATION

    我正在尝试编写一个小程序 该程序作为服务运行并监视用户是否处于活动状态 如果用户空闲 没有鼠标 键盘 一个小时 则某些进程将被终止 如果用户使用 user32 dll 中的 LASTINPUTINFO 运行它 它就可以工作 但它不能作为服务
  • 资源文件是否编译为 UNICODE 或 ANSI 代码页?

    首先 如果这个问题已经被回答了一百次了 我深表歉意 噢 但我的搜索显然很糟糕 因为我没有运气回答这个基本问题 EXE DLL中的资源是如何存储的 作为 UNICODE UCS 2 Windows 本机内部字符格式 还是使用资源块的代码页作为
  • WinForms:如何确定窗口是否不再活动(没有子窗口具有焦点)?

    我的应用程序使用多个窗口 我想隐藏一个特定窗口 以防应用程序失去焦点 当活动窗口不是应用程序窗口时 source https stackoverflow com questions 466354 how can i tell if a wi
  • 如何在win32中使用GetSaveFileName保存文件?

    我编写此代码是为了获取 fileName 来保存我的文件 include stdafx h include
  • InvalidateRect 和 RedrawWindow 的区别

    当我想重绘窗口时 InvalidateRect 和 RedrawWindow 之间是否有首选函数可以调用 例如 这两个调用是否相等 win 将是 HWND RedrawWindow win NULL NULL RDW INVALIDATE
  • 高级 Win32 图像文件 I/O?

    我想在 Windows C 应用程序中将图像文件读入内存 什么是一个相当简单的解决方案 也许类似于 IOS 提供的UIImage 我希望支持合理数量的文件格式 我需要为图像处理的位图提供一些低级访问权限 我在互联网上阅读了很多内容 看起来
  • WndProc调用机制(WinAPI)

    我试图了解 Windows 应用程序是如何工作的 有一个WndProc函数 其中发生消息处理 LRESULT CALLBACK WndProc HWND hwnd UINT msg WPARAM wParam LPARAM lParam s
  • 原始 PDO 将 IOCTL 发送到上层过滤器驱动程序 (kbfiltr/moufiltr) 以启用/禁用设备

    我对驱动程序开发非常陌生 并尝试编写一个简单的过滤驱动程序来启用或禁用键盘或鼠标设备 如果我能让它工作 我想在插入鼠标时使用它来禁用笔记本电脑上的触摸板 我意识到可能已经有软件可以做到这一点 但我对设备驱动程序非常感兴趣并且想要自己学习如何
  • 从 SinkWriter 或 ICodecAPI 或 IMFTransform 获取编码器名称

    我使用 SinkWriter 来使用媒体基础对视频进行编码 初始化 SinkWriter 后 我想获取它使用的底层编码器 并打印出它的名称 这样我就可以看到它使用的编码器 就我而言 编码器很可能是H 264 视频编码器 http msdn
  • 从单击的按钮上移除焦点

    当我单击按钮时 焦点将设置到该按钮 如何使用 C 中的 WIN API 移除此按钮的焦点 我想也许以某种方式SendMessageWIN API 方法可以从按钮上移除焦点 我只有按钮的句柄 也无法再访问父窗口 我知道几乎每次都可以使用 Se
  • Win32 错误代码的大写文本标识符是什么,以及如何在给定错误代码的情况下以编程方式确定它们?

    In Win32 错误代码列表 https msdn microsoft com en us library windows desktop ms681382 28v vs 85 29 aspx 每个错误都包含三个组成部分 数字错误代码 描
  • 没有窗口的 GetFontUnicodeRanges

    有机会打电话吗GetFontUnicodeRanges没有窗户 例如 它可能是不允许与桌面交互的 Windows 服务 目前我正在使用控制台应用程序对此进行测试 program UnicodeConsoleOutput APPTYPE CO
  • C# 的 user32 和内核方法列表 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 有没有一个很好的清单来说明我们可以从中进口什么user32 dll and kernel dll并在 C 中使用 我是 Windows A
  • 注册表碎片整理程序[重复]

    这个问题在这里已经有答案了 这是出于好奇 但我见过几个 其中一些非常流行 称为注册表碎片整理程序的软件 虽然我可以看到它们提供的好处 但我很好奇您到底是如何进行注册表碎片整理的 请注意 我并不是要求提供软件名称 只是询问其如何以编程方式完成
  • 使用 WinAPI 连接禁用的显示设备

    我的问题是启用禁用的监视器ChangeDisplaySettingsEx 我想这不是火箭科学 但经过一番挖掘后 它看起来仍然是不可能的 我找到了一种根据找到的 Microsoft 代码示例禁用所有辅助显示器的方法here https msd
  • 多个原始输入窗口接收器

    我有一个仅消息窗口 ATL CWindowImpl 它使用 RIDEV INPUTSINK 标志将自身注册为原始输入 这意味着无论该窗口是否是前台窗口 它都会获取所有输入 当该窗口只有一个实例时 这非常有效 但是 当我创建超过 1 个窗口实
  • 避免 UAC 但使用 Windows 服务启动提升的进程

    我有一个非交互式服务作为 Windows 计算机上的特权系统用户运行 我需要它来启动给定的可执行文件作为提升的进程 我已设法使用 WTSGetActiveConsoleSessionId 以 SYSTEM 身份启动一个子进程 找到一个系统进
  • 获取Windows下新线程/删除线程的通知

    创建 DLL 时 您可以在 DllMain 函数 DLL THREAD ATTACH DLL THREAD DETACH 中获取有关新线程 退出线程的通知 有没有办法在 非托管 可执行文件中从 Windows 获取这些或等效通知 是的 在您

随机推荐