【问题标题】:call Win32 API in flex to set Window Display Affinity在 flex 中调用 Win32 API 来设置 Window Display Affinity
【发布时间】:2015-08-23 18:31:01
【问题描述】:

我使用 Adob​​e Air 创建了一个 Flex 桌面应用程序。 我需要保护应用程序不被捕获。通过更改应用程序的窗口显示亲和性,可以保护应用程序不被捕获。 如何在flex中使用win API? 有没有其他方法可以保护窗口不被捕获?

【问题讨论】:

  • 您介意我的回答是否说您必须构建一个 C DLL,作为“Air Extension”(对于 Air 3)?
  • 如果你从其他进程调用setwindowdisplayaffinity,它会返回ACCESS DENIED。那样就没用了。
  • DLL 将是一个 AIR 扩展,在应用程序进程中运行。这里没有“拒绝访问”。
  • 实际上我使用 flerry 作为 Java 和 Flex 之间的 Java 桥梁。尽管 java 中的代码来自同一个进程,但它给出了“ACCESS DENIED”错误。我正在使用FindWindow(null,title) 查找窗口以获取应用程序的 HWND,然后更改窗口显示关联。有没有直接的方法让应用程序的 HWND 运行?顺便说一句,如果可能的话,分享将 C DLL 构建为 Air Extension 的示例链接
  • 我不明白。你为什么想要HWND?因“拒绝访问”而失败的 API 是 FindWindow 还是 SetWindowDisplayAffinity?你应该更新你的问题。 AIR 扩展链接:adobe.com/content/dam/Adobe/en/devnet/devices/pdfs/…

标签: actionscript-3 winapi apache-flex actionscript air


【解决方案1】:

首先您必须确保主窗口没有WS_EX_LAYERED Windows 样式。这种风格使SetWindowDisplayAffinity 失败,代码为 8 (ERROR_NOT_ENOUGH_MEMORY),至少在我的机器上(7 Pro 64 位)。在您的-app.xml file 中,将<initialWindow> 下的节点<transparent> 的值设置为false。

其次,您必须选择如何在应用程序进程中注入常规 C DLL,因为如果您尝试更改不在调用者进程中的窗口的亲和性,API 将失败并出现错误 5 (ERROR_ACCESS_DENIED) .

一种可能的注入方法是使用SetWindowsHookEx API。谷歌会给你很多关于那个的点击。随意询问一些细节。你显然需要另一个进程的合作,这里(和一些 Win32 API 实践)。

另一种可能的方法是编码'ACTIONSCRIPT® Extensions for ADOBE® AIR®' (PDF)。

后者似乎更可取:

  • 无需来自外部流程的协作。
  • Adobe AIR 为您加载 DLL。
  • C/C++ 代码更简单。

我使用了第一种技术,因为我更熟悉有关 DLL 的原始 Win32 API,而不是 AIR 和 Action Script...

我用一个非常简单的“Hello World”AIR 桌面应用程序成功地测试了第一种技术,并在 Print Screen 之后获得了一个漂亮的“全黑”图像。

【讨论】:

    猜你喜欢
    • 2020-10-03
    • 2021-12-23
    • 1970-01-01
    • 1970-01-01
    • 2015-08-31
    • 2017-12-02
    • 2019-11-25
    • 2017-08-28
    • 1970-01-01
    相关资源
    最近更新 更多