【问题标题】:Should SetWindowsHookEx work on Windows 7 on Mac Mini (parallels)SetWindowsHookEx 是否应该在 Mac Mini 上的 Windows 7 上工作(并行)
【发布时间】:2013-09-13 20:28:40
【问题描述】:

给定一个设置 uiAccess="true" 的适当清单,win32 程序(在其他 Windows7 系统上运行良好)是否能够在使用 Parallels 在 Mac Mini 上的 Windows7(32 位)上运行时从 SetWindowsHookEx 获取有效句柄?

这是调用 API 的 Delphi XE4 代码行

HookHandle := SetWindowsHookEx(WH_JOURNALPLAYBACK, @Playback, hInstance, 0);

由于 HookHandle 中返回的系统错误,我不断收到“访问被拒绝”。

我已经尝试了多种清单语法,我非常想知道这是否只是 Mac Mini / Parallels 环境的一些限制。调用程序的用户是管理员。 UAC 已启用。我试过以管理员身份运行;没有区别。

我的清单文件如下。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <assemblyIdentity   type="win32" name="FFHotKeys" version="1.1.0.0  processorArchitecture="*"/>
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel level="asInvoker" uiAccess="true"/>
      </requestedPrivileges>
    </security>
  </trustInfo>
  <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
    <application>
      <!--The ID below indicates application support for Windows 7 -->
      <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
    </application>
  </compatibility>
</assembly>

我已经尝试过设置每个级别的级别

level="asInvoker"
level="requireAdministrator"
level="highestAvailable"

这并没有解决“拒绝访问”问题。

注意:我通过 .rc 文件包含我的清单

1 24 "FFHotKeys.exe.manifest"

而不是通过项目 > 选项下的自定义清单功能。我有“启用运行时主题”和一个空白的自定义清单。我尝试了另一种方式,但 .manifest 内容略有不同。

注意:当我使用 XN_Resource_Editor 检查资源时,有一个“XP Theme Manifest”资源包含完全预期的 XML。还有 2 个 VCLSTYLE 资源。 谢谢。

【问题讨论】:

  • Windows 7 就是 Windows 7,所以我不明白为什么模拟器应该是一个因素。
  • 你明白这个钩子是一个全局钩子吧? uiAccess 和这有什么关系?
  • @DavidHeffernan:我从stackoverflow.com/questions/9165666/…autohotkey.com/board/topic/… 得到了 uiAccess 的想法,上面写着“要设置日志挂钩,需要对应用程序进行签名、显示为 uiAccess,并从安全的位置(通常是程序文件)。”我确实将 exe 移至 c:\Program Files\,并对其进行了代码签名。
  • 很公平。标记列表已更改。我可能在 Delphi XE4 中错误地设置了清单。使用内置的 Project > Options、Application、Runtime Themes、Custom Manifest 功能没有得到很好的结果,所以我只是将 .manifest 文件绑定为资源。因此想知道它是否应该工作。
  • 你确定processorArchitecture="*"?我似乎记得尝试过一次并发现问题。我的代码酌情使用 amd64 或 X86。此外,您传递的模块句柄在 DLL 中而不是在应用程序中并不明显。

标签: delphi winapi manifest parallels


【解决方案1】:

答案是肯定的,它应该并且确实可以在 Parallels 上工作。

问题已通过使用 XN_Resource_Editor 检查编译的 EXE 得到澄清。原来,在 Project > Build 之前删除 .RES 文件的唯一原因是资源被重新编译,因此测试结果令人困惑。更重要的是,当涉及到 RunTime 主题时,Delphi XE4 使用其默认清单。因此,解决方案是删除项目中的资源引用,而是使用项目 > 选项、应用程序、运行时主题,选择 自定义清单,然后选择项目 > 构建并对 EXE 进行代码签名并从中运行它在 c:\Program Files\subdir 下。

processorArchitecture="*" 

在清单中有效

<requestedExecutionLevel level="asInvoker" uiAccess="true"/>

在清单中有效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-09
    • 2021-11-26
    • 1970-01-01
    • 1970-01-01
    • 2011-09-11
    • 2017-08-12
    • 1970-01-01
    • 2012-07-04
    相关资源
    最近更新 更多