我不知道如何检测屏幕锁定,但有这些观察者通知:
https://developer.mozilla.org/en-US/docs/Observer_Notifications#Idle_Service
还有计算机睡眠唤醒通知。生病四处询问锁定屏幕,这是一个有趣的。
关于这个主题的一些有用的聊天,看看谷歌浏览器是如何做到的:
[12:33] 好的,伙计们对实际工作提出疑问。有谁知道如何检测屏幕是否被锁定?显然谷歌浏览器有一个方法:https://developer.chrome.com/extensions/idle#event-onStateChanged
[12:45] 有人知道谷歌浏览器代码库的 MXR 或 DXR 吗?
[12:46] mxr.mozilla.org/chromium
[12:52] Ms2ger:你能帮我看看他们是如何测试屏幕锁定的吗?我在看这里:http://mxr.mozilla.org/chromium/source/src/chrome/browser/extensions/api/idle/idle_api_unittest.cc#84
[12:56] 哦,糟糕,他们好像在投票:http://mxr.mozilla.org/chromium/source/src/chrome/browser/extensions/api/idle/idle_manager.h#118
也许他们没有投票。
看看这个:
http://mxr.mozilla.org/chromium/source/src/chrome/browser/extensions/api/idle/idle_manager.cc#246
244 void IdleManager::UpdateIdleStateCallback(int idle_time) {
245 DCHECK(thread_checker_.CalledOnValidThread());
246 bool locked = idle_time_provider_->CheckIdleStateIsLocked();
247 int listener_count = 0;
导致:http://mxr.mozilla.org/chromium/source/src/chrome/browser/idle_win.cc#52
52 bool CheckIdleStateIsLocked() {
53 return ui::IsWorkstationLocked() || IsScreensaverRunning();
54 }
因此我们可以测试屏幕保护程序是否正在运行或工作站是否锁定
导致:
总结一下:
[13:32] 对于 Windows,它的小菜一碟 winapi 已调用测试屏幕是否已锁定或屏幕保护程序正在运行
[13:32] 对于 Mac,他们没有屏幕锁定测试。他们只是有屏幕保护程序测试,但它是一个观察者方法
[13:32] 对于 linux,他们没有屏幕锁定或屏幕保护程序测试。真奇怪。我问他是否知道他们支持 chrome.idle 的哪个操作系统
编辑:实际上我找到了 linux 实现。从搜索结果返回:CheckIdleStateLocked:http://mxr.mozilla.org/chromium/search?string=CheckIdleStateIsLocked
-
http://mxr.mozilla.org/chromium/source/src/chrome/browser/idle_linux.cc#24
24 bool CheckIdleStateIsLocked() {
25 // Usually the screensaver is used to lock the screen, so we do not need to
26 // check if the workstation is locked.
27 #if defined(OS_CHROMEOS)
28 return false;
29 #elif defined(USE_OZONE)
30 return false;
31 #else
32 return ScreensaverWindowFinder::ScreensaverWindowExists();
33 #endif
34 }
-
导致询问ScreensaverWindowExists 我们如何找到这个:http://mxr.mozilla.org/chromium/source/src/chrome/browser/screensaver_window_finder_x11.cc
15 bool ScreensaverWindowFinder::ScreensaverWindowExists() {
16 gfx::X11ErrorTracker err_tracker;
17 ScreensaverWindowFinder finder;
18 ui::EnumerateTopLevelWindows(&finder);
19 return finder.exists_ && !err_tracker.FoundNewError();
20 }
-
导致EnumerateTopLevelWindowshttp://mxr.mozilla.org/chromium/source/src/ui/base/x/x11_util.cc#1059是什么:
1059 void EnumerateTopLevelWindows(ui::EnumerateWindowsDelegate* delegate) {
1060 std::vector<XID> stack;
1061 if (!ui::GetXWindowStack(ui::GetX11RootWindow(), &stack)) {
1062 // Window Manager doesn't support _NET_CLIENT_LIST_STACKING, so fall back
1063 // to old school enumeration of all X windows. Some WMs parent 'top-level'
1064 // windows in unnamed actual top-level windows (ion WM), so extend the
1065 // search depth to all children of top-level windows.
1066 const int kMaxSearchDepth = 1;
1067 ui::EnumerateAllWindows(delegate, kMaxSearchDepth);
1068 return;
1069 }
1070 XMenuList::GetInstance()->InsertMenuWindowXIDs(&stack);
1071
1072 std::vector<XID>::iterator iter;
1073 for (iter = stack.begin(); iter != stack.end(); iter++) {
1074 if (delegate->ShouldStopIterating(*iter))
1075 return;
1076 }
1077 }
1078
-
我们说他们打电话给delegate->ShouldStopIterating,这与ScreensaverWindowExists在同一文件中看到:http://mxr.mozilla.org/chromium/source/src/chrome/browser/screensaver_window_finder_x11.cc
22 bool ScreensaverWindowFinder::ShouldStopIterating(XID window) {
23 if (!ui::IsWindowVisible(window) || !IsScreensaverWindow(window))
24 return false;
25 exists_ = true;
26 return true;
27 }
引导询问IsWindowVisible和IsScreensaverWindow是什么
*IsScreensaverWindow,在ScreensaverWindowExists的同一文件中:http://mxr.mozilla.org/chromium/source/src/chrome/browser/screensaver_window_finder_x11.cc
29 bool ScreensaverWindowFinder::IsScreensaverWindow(XID window) const {
30 // It should occupy the full screen.
31 if (!ui::IsX11WindowFullScreen(window))
32 return false;
33
34 // For xscreensaver, the window should have _SCREENSAVER_VERSION property.
35 if (ui::PropertyExists(window, "_SCREENSAVER_VERSION"))
36 return true;
37
38 // For all others, like gnome-screensaver, the window's WM_CLASS property
39 // should contain "screensaver".
40 std::string value;
41 if (!ui::GetStringProperty(window, "WM_CLASS", &value))
42 return false;
43
44 return value.find("screensaver") != std::string::npos;
45 }
-
IsWindowVisible:http://mxr.mozilla.org/chromium/source/src/ui/base/x/x11_util.cc#546
546 bool IsWindowVisible(XID window) {
547 TRACE_EVENT0("ui", "IsWindowVisible");
548
549 XWindowAttributes win_attributes;
550 if (!XGetWindowAttributes(gfx::GetXDisplay(), window, &win_attributes))
551 return false;
552 if (win_attributes.map_state != IsViewable)
553 return false;
554
555 // Minimized windows are not visible.
556 std::vector<XAtom> wm_states;
557 if (GetAtomArrayProperty(window, "_NET_WM_STATE", &wm_states)) {
558 XAtom hidden_atom = GetAtom("_NET_WM_STATE_HIDDEN");
559 if (std::find(wm_states.begin(), wm_states.end(), hidden_atom) !=
560 wm_states.end()) {
561 return false;
562 }
563 }