Что может заставить Windows отцепить низкоуровневую (глобальную) зацепку клавиатуры?

Браузеры могут заблокировать доступ к window.top из-за политики того же происхождения . Ошибки IE также имеют место. Вот рабочий код:

function inIframe () {
    try {
        return window.self !== window.top;
    } catch (e) {
        return true;
    }
}

top и self - оба объекта window (вместе с parent), поэтому вы видите, что ваше окно является верхним окном.

24
задан Davy8 20 April 2010 в 18:45
поделиться

4 ответа

Я думаю, это проблема с тайм-аутом.

Другие разработчики сообщили о специфической для Windows7 проблеме с отключением перехватчиков низкого уровня, если они превышают (недокументированное) значение тайм-аута.

См. эту ветку , где другие разработчики обсуждают ту же проблему. Возможно, вам нужно выполнить цикл занятости (или медленную сборку мусора), а не спящий режим, чтобы вызвать поведение отключения. Точка останова в функции LowLevelKeyboardProc также может создавать проблемы с тайм-аутом. (Также было замечено, что сильная загрузка ЦП другой задачей может спровоцировать такое поведение - предположительно потому, что другая задача крадет циклы ЦП у функции LowLevelKeyboardProc и заставляет ее выполнять слишком много времени.)

Решение, предлагаемое в этом потоке, состоит в том, чтобы попробуйте установить для параметра DWORD LowLevelHooksTimeout в реестре HKEY_CURRENT_USER \ Control Panel \ Desktop большее значение.

Помните, что одно из достоинств C # состоит в том, что даже простые операторы могут занять чрезмерно много времени, если происходит сборка мусора. Это (или загрузка ЦП другими потоками) может объяснить прерывистый характер проблемы.

16
ответ дан 29 November 2019 в 00:15
поделиться

Возможно, у кого-то еще есть ловушка, которая не вызывает CallNextHookEx ()?

1
ответ дан 29 November 2019 в 00:15
поделиться

Я подумал о двух вещах, которые могут помочь вам выяснить, в чем проблема.

  1. Чтобы помочь определить местонахождение проблемы, запустите еще одну ловушку WH_KEYBOARD_LL одновременно с текущей ловушкой, и пусть он ничего не сделает, кроме передачи данных по цепочке ловушек. Когда вы обнаружите, что ваш исходный крючок отцеплен, проверьте, был ли отцеплен и этот «фиктивный» крючок. Если «фиктивный» перехватчик также был отцеплен, вы можете быть уверены, что проблема находится за пределами вашего перехватчика (например, в Windows или в чем-то, связанном с вашим процессом в целом?). Если «фиктивный» перехватчик не был отцеплен, значит, проблема вероятно где-то внутри вашего крючка.

  2. Регистрируйте информацию, которая поступает на вашу ловушку через обратный вызов, и запускайте ее, пока ловушка не будет отсоединена. Повторите это несколько раз и проверьте зарегистрированные данные, чтобы увидеть, можете ли вы различить закономерность, ведущую к отсоединению.

Я бы попробовал их по одному, на всякий случай, если один из них повлияет на результат других. Если после этого у вас не будет никаких сведений о том, в чем может быть проблема, вы можете попробовать объединить их.

3
ответ дан 29 November 2019 в 00:15
поделиться

Это маловероятно, но случайно ли у вас запущено антивирусное программное обеспечение? Это вполне могло быть замечанием зацепа клавиатуры и его отбрасыванием.

Скорее всего, он предупредит вас и немедленно удалит его, но это одна из тех странных вещей, которые стоит проверить.

2
ответ дан 29 November 2019 в 00:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: