Совершенно нормально звонить FB.login
с помощью обратного вызова FB.getLoginStatus
, если вы уверены, что статус входа в систему уже был загружен внутри страны. Для этого воспользуйтесь одним из них:
FB.init({..., status: true, ... })
. FB.getLoginStatus(...)
FB.login(...)
FB.ui(...)
Технически все эти опции используют FB.ui
. Асинхронный процесс должен завершиться, что может занять несколько секунд. До тех пор, пока вы уже использовали один из методов выше, чтобы сделать междоменный вызов с FB, и этот асинхронный процесс завершен, получение статуса входа в систему не сделает асинхронный вызов, и всплывающее окно не будет заблокировано. ]
Также следует убедиться, что не указывает true
для второго параметра, как в FB.getLoginStatus(..., true);
.
from ctypes import Structure, windll, c_uint, sizeof, byref
class LASTINPUTINFO(Structure):
_fields_ = [
('cbSize', c_uint),
('dwTime', c_uint),
]
def get_idle_duration():
lastInputInfo = LASTINPUTINFO()
lastInputInfo.cbSize = sizeof(lastInputInfo)
windll.user32.GetLastInputInfo(byref(lastInputInfo))
millis = windll.kernel32.GetTickCount() - lastInputInfo.dwTime
return millis / 1000.0
Вызов get_idle_duration ()
, чтобы узнать время простоя в секундах.
На самом деле вы можете получить доступ к GetLastInputInfo
через библиотеку cytpes
:
import ctypes
GetLastInputInfo = ctypes.windll.User32.GetLastInputInfo # callable function pointer
Это может быть не то, что вам нужно, поскольку она не предоставляет простаивающая информация по всей системе, но только о сеансе, вызвавшем функцию. См. Документацию MSDN.
В качестве альтернативы, вы можете проверить, заблокирована ли система или запущена ли заставка.
Похоже, что GetLastInputInfo
теперь доступен в pywin32:
win32api.GetLastInputInfo()
делает свое дело и возвращает тик таймера от последнего действия, введенного пользователем.
Вот пример программы
import time
import win32api
for i in range(10):
print(win32api.GetLastInputInfo())
time.sleep(1)
Если нажать клавишу / передвинуть мышь, пока сценарий спит, напечатанное число изменится.