Должен ли SetWindowsHookEx работать в Windows 7 на Mac Mini (параллельно)

Учитывая соответствующий манифест, который устанавливает uiAccess="true", должна ли программа win32 (которая отлично работает в других системах Windows7) получить действительный дескриптор от SetWindowsHookEx при работе в Windows7 (32-разрядная версия) на Mac Mini с использованием Parallels?

Это строка кода Delphi XE4, которая вызывает API

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

Я продолжаю получать «доступ запрещен», поскольку системная ошибка возвращается в HookHandle.

Я пробовал много вариантов синтаксиса моего манифеста и серьезно задаюсь вопросом, является ли это просто некоторым ограничением среды Mac Mini/Parallels. Пользователь, вызывающий программу, является администратором. УАК включен. Я пробовал работать от имени администратора; нет разницы.

Далее следует мой файл манифеста.

<?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», содержащий именно ожидаемый XML. Также есть 2 ресурса VCLSTYLE. Спасибо.


person user424855    schedule 10.09.2013    source источник
comment
Windows 7 — это Windows 7, поэтому я не понимаю, почему эмулятор должен быть фактором.   -  person Jonathan Potter    schedule 10.09.2013
comment
Вы же понимаете, что этот хук глобальный? Какое отношение к этому имеет uiAccess?   -  person David Heffernan    schedule 10.09.2013
comment
@DavidHeffernan: я получил идею uiAccess от stackoverflow.com/questions/9165666/ и autohotkey.com/board/topic/, где написано "Чтобы установить обработчик журнала, приложение должно быть подписано, манифестировано для uiAccess и запущено из надежном месте (обычно Program Files). Я переместил исполняемый файл в c:\Program Files\ и поставил кодовую подпись.   -  person user424855    schedule 10.09.2013
comment
Справедливо. Список тегов изменен. Возможно, я неправильно устанавливаю манифест в Delphi XE4. У меня не было хороших результатов при использовании встроенных Project › Options, Application, Runtime Themes, Custom Manifest, поэтому я просто привязал файл .manifest в качестве ресурса. Поэтому хочется знать, должно ли это работать.   -  person user424855    schedule 10.09.2013
comment
Вы уверены насчет processorArchitecture="*"? Кажется, я помню, как пытался это сделать один раз и обнаружил проблемы. Мой код использует amd64 или X86 в зависимости от обстоятельств. Кроме того, не очевидно, что дескриптор модуля, который вы передаете, находится в DLL, а не в приложении.   -  person David Heffernan    schedule 10.09.2013
comment
Я пробовал X86 один раз, но это не единственное изменение. Я смогу снова подключиться к проблемной машине примерно через 12 часов, поэтому тогда я подтвержу. Дескриптор модуля находится в приложении, а рассматриваемая функция объявлена ​​с помощью stdcall; экспорт;   -  person user424855    schedule 10.09.2013


Ответы (1)


Ответ: ДА, это должно работать и работает на Parallels.

Проблема была прояснена с помощью XN_Resource_Editor для проверки скомпилированного EXE-файла. Оказывается, единственное удаление файла .RES до Project > Build приводило к перекомпиляции ресурсов, поэтому результаты теста были запутанными. Что еще более важно, Delphi XE4 использует свой манифест по умолчанию, когда задействованы темы RunTime. Поэтому решение состояло в том, чтобы удалить ссылки на ресурсы в проекте и вместо этого использовать «Проект»> «Параметры», «Приложение», «Темы времени выполнения», выбрать пользовательский манифест, а затем «Проект»> «Создать и подписать код» EXE и запустить его из в каталоге c:\Program Files\subdir.

processorArchitecture="*" 

был действителен в манифесте

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

был действителен в манифесте.

person user424855    schedule 10.09.2013