Браузеры могут заблокировать доступ к window.top
из-за политики того же происхождения . Ошибки IE также имеют место. Вот рабочий код:
function inIframe () {
try {
return window.self !== window.top;
} catch (e) {
return true;
}
}
top
и self
- оба объекта window
(вместе с parent
), поэтому вы видите, что ваше окно является верхним окном.
Я думаю, это проблема с тайм-аутом.
Другие разработчики сообщили о специфической для Windows7 проблеме с отключением перехватчиков низкого уровня, если они превышают (недокументированное) значение тайм-аута.
См. эту ветку , где другие разработчики обсуждают ту же проблему. Возможно, вам нужно выполнить цикл занятости (или медленную сборку мусора), а не спящий режим, чтобы вызвать поведение отключения. Точка останова в функции LowLevelKeyboardProc также может создавать проблемы с тайм-аутом. (Также было замечено, что сильная загрузка ЦП другой задачей может спровоцировать такое поведение - предположительно потому, что другая задача крадет циклы ЦП у функции LowLevelKeyboardProc и заставляет ее выполнять слишком много времени.)
Решение, предлагаемое в этом потоке, состоит в том, чтобы попробуйте установить для параметра DWORD LowLevelHooksTimeout в реестре HKEY_CURRENT_USER \ Control Panel \ Desktop большее значение.
Помните, что одно из достоинств C # состоит в том, что даже простые операторы могут занять чрезмерно много времени, если происходит сборка мусора. Это (или загрузка ЦП другими потоками) может объяснить прерывистый характер проблемы.
Возможно, у кого-то еще есть ловушка, которая не вызывает CallNextHookEx ()?
Я подумал о двух вещах, которые могут помочь вам выяснить, в чем проблема.
Чтобы помочь определить местонахождение проблемы, запустите еще одну ловушку WH_KEYBOARD_LL
одновременно с текущей ловушкой, и пусть он ничего не сделает, кроме передачи данных по цепочке ловушек. Когда вы обнаружите, что ваш исходный крючок отцеплен, проверьте, был ли отцеплен и этот «фиктивный» крючок. Если «фиктивный» перехватчик также был отцеплен, вы можете быть уверены, что проблема находится за пределами вашего перехватчика (например, в Windows или в чем-то, связанном с вашим процессом в целом?). Если «фиктивный» перехватчик не был отцеплен, значит, проблема вероятно где-то внутри вашего крючка.
Регистрируйте информацию, которая поступает на вашу ловушку через обратный вызов, и запускайте ее, пока ловушка не будет отсоединена. Повторите это несколько раз и проверьте зарегистрированные данные, чтобы увидеть, можете ли вы различить закономерность, ведущую к отсоединению.
Я бы попробовал их по одному, на всякий случай, если один из них повлияет на результат других. Если после этого у вас не будет никаких сведений о том, в чем может быть проблема, вы можете попробовать объединить их.
Это маловероятно, но случайно ли у вас запущено антивирусное программное обеспечение? Это вполне могло быть замечанием зацепа клавиатуры и его отбрасыванием.
Скорее всего, он предупредит вас и немедленно удалит его, но это одна из тех странных вещей, которые стоит проверить.