Firefox扩展/插件-检测工作区已锁定
我正在firefox插件中搜索解决方案,以检测用户工作区何时锁定/释放。google chrome中有一个简单的APIFirefox扩展/插件-检测工作区已锁定,firefox,firefox-addon,firefox-addon-sdk,Firefox,Firefox Addon,Firefox Addon Sdk,我正在firefox插件中搜索解决方案,以检测用户工作区何时锁定/释放。google chrome中有一个简单的APIchrome.idle.onStateChanged.addListener,对于它,firefox中是否有类似的东西,或者是否有可能做到这一点,与平台无关? 顺便说一下,我使用插件sdk 我已经尝试了空闲服务: Cc["@mozilla.org/widget/idleservice;1"].getService(Ci.nsIIdleService) 但我只允许我在进入睡眠状
chrome.idle.onStateChanged.addListener
,对于它,firefox中是否有类似的东西,或者是否有可能做到这一点,与平台无关?
顺便说一下,我使用插件sdk
我已经尝试了空闲服务:
Cc["@mozilla.org/widget/idleservice;1"].getService(Ci.nsIIdleService)
但我只允许我在进入睡眠状态时访问空闲超时或系统,而不仅仅是锁定工作区
编辑:“工作区锁定”是指用户用ctrl+alt+delete锁定工作区。我不知道这在OSX或linux上到底是如何工作的
Edit2:我目前在Windows8.1中工作,但我猜chrome.idle
处理程序可以跨平台工作
编辑3:我现在从当前的答案中得到的是
1.chrome和firefox都没有跨平台的解决方案。
chrome.idle.onStateChanged
在windows、linux和osx上的工作方式似乎有所不同。只有windows才能按预期处理“锁定”行为。我不能测试OSX,在ubuntu 14上它对我不起作用。2.对于firefox,有一些深入的代码可以让它工作——请参阅本主题中Noitidart的回答
Edit4:Noitidart已经找到了windows的解决方案-。我不知道如何检测屏幕锁定,但有以下观察员通知: 此外,还提供计算机睡眠唤醒通知。我四处打听一下锁屏那是个有趣的东西 关于这个主题的一些有用的聊天,看看google chrome是如何做到的: [12:33]好的,各位问一下实际工作。有人知道如何检测屏幕是否被锁定吗?显然google chrome有一个方法: [12:45]有人知道谷歌chromes codebase的MXR或DXR吗 [12:46]mxr.mozilla.org/chromium [12:52]Ms2ger:你能帮我找到他们是如何测试屏幕锁的吗。我在看这里: [12:56]噢,糟糕,看起来他们在投票: 也许他们没有投票 看看这个: 导致: 因此,我们需要测试屏幕保护程序是否正在运行或工作站是否已锁定 导致:
-
- 我们只看到一个实现(很奇怪,因为没有linux支持,但在chrome文档页面上没有这样说,所以我可能找不到它)
- 窗户
- 苹果
- 请参阅下面的屏幕保护程序部分,屏幕锁也通过该部分进行处理
- 窗户
- 我们只看到一个实现(很奇怪,因为没有linux支持,但在chrome文档页面上没有这样说,所以我可能找不到它)
- ^%5B^\0%5D*%24&hitlimit=&tree=chromium
- 我们在这个search results 2实现中看到,mac和windows似乎不支持linux,这很奇怪,因为chrome.idle页面在文档中没有提到这一点,也许我就是找不到它
- windows实施:
- mac实现:
- 我们在这个search results 2实现中看到,mac和windows似乎不支持linux,这很奇怪,因为chrome.idle页面在文档中没有提到这一点,也许我就是找不到它
CheckIdleStateLocked
:
- 引导人们询问
我们发现:屏幕保护程序Windows是如何存在的
- 导致什么是
:EnumerateTopLevelWindows
- 引导询问什么是
和IsWindowVisible
IsScreensaverWindow
IsScreensaverWindow
,与屏幕保护程序Windows存在的文件相同:
IsWindowVisible
:
546 bool IsWindowVisible(XID窗口){
547跟踪事件0(“ui”、“IsWindowVisible”);
548
549个XWindowAttributes win_属性;
550如果(!XGetWindowAttributes(gfx::GetXDisplay()、窗口和win_属性))
551返回错误;
552如果(win_attributes.map_state!=可查看)
553返回错误;
554
555//最小化的窗口不可见。
556 std::矢量wm_状态;
557 if(GetAtomArrayProperty(窗口,“\u NET\u WM\u STATE”&WM\u 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返回错误;
562 }
563 }
你所说的工作APCE被锁定是什么意思?就像windows一样,如果用户用ctrl+alt+del锁定屏幕?如果没有人找到解决方案,请毫不犹豫地在组件工具包
中提交错误,然后添加我(:Yoric
)在抄送列表中。我不做任何承诺,但核心开发者或非正规贡献者可能对此感兴趣。谢谢@Yoric,我想我会查找google chrome的源代码,比如MXR或DXR,并给这家伙一个js ctypes解决方案,直到我们得到XPCOM解决方案。而且,如果我在google chrome中找到该代码,我可以将其发布到bugzilla主题,这听起来像是一个很好的第一个bug。@BrianFolong你知道chrome.idle的操作系统是什么吗?你能帮我测试一下吗?在mac上,它看起来只有在屏幕保护程序打开时才会触发锁定。在windows上,当屏幕保护程序锁定或运行时,它看起来工作正常。在linux上,它看起来根本不支持它。你能吗请验证。实际上它看起来mac也支持screnlock。所以windows和mac支持ScreenClock和screensaver。linux呢?从源代码上看,这两个版本都不支持,但我不确定,你能验证一下吗。这些文档说明了关于操作系统的任何内容。大量的答案,谢谢。我将播放一段时间,这就是先在窗户上睡觉。嘿@Bra
244 void IdleManager::UpdateIdleStateCallback(int idle_time) {
245 DCHECK(thread_checker_.CalledOnValidThread());
246 bool locked = idle_time_provider_->CheckIdleStateIsLocked();
247 int listener_count = 0;
52 bool CheckIdleStateIsLocked() {
53 return ui::IsWorkstationLocked() || IsScreensaverRunning();
54 }
11 bool IsWorkstationLocked() {
12 bool is_locked = true;
13 HDESK input_desk = ::OpenInputDesktop(0, 0, GENERIC_READ);
14 if (input_desk) {
15 wchar_t name[256] = {0};
16 DWORD needed = 0;
17 if (::GetUserObjectInformation(
18 input_desk, UOI_NAME, name, sizeof(name), &needed)) {
19 is_locked = lstrcmpi(name, L"default") != 0;
20 }
21 ::CloseDesktop(input_desk);
22 }
23 return is_locked;
24 }
39 bool IsScreensaverRunning() {
40 DWORD result = 0;
41 if (::SystemParametersInfo(SPI_GETSCREENSAVERRUNNING, 0, &result, 0))
42 return result != FALSE;
43 return false;
44 }
45
28 - (id)init {
29 if ((self = [super init])) {
30 NSDistributedNotificationCenter* distCenter =
31 [NSDistributedNotificationCenter defaultCenter];
32 [distCenter addObserver:self
33 selector:@selector(onScreenSaverStarted:)
34 name:@"com.apple.screensaver.didstart"
35 object:nil];
36 [distCenter addObserver:self
37 selector:@selector(onScreenSaverStopped:)
38 name:@"com.apple.screensaver.didstop"
39 object:nil];
40 [distCenter addObserver:self
41 selector:@selector(onScreenLocked:)
42 name:@"com.apple.screenIsLocked"
43 object:nil];
44 [distCenter addObserver:self
45 selector:@selector(onScreenUnlocked:)
46 name:@"com.apple.screenIsUnlocked"
47 object:nil];
48 }
49 return self;
50 }
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 }
15 bool ScreensaverWindowFinder::ScreensaverWindowExists() {
16 gfx::X11ErrorTracker err_tracker;
17 ScreensaverWindowFinder finder;
18 ui::EnumerateTopLevelWindows(&finder);
19 return finder.exists_ && !err_tracker.FoundNewError();
20 }
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
22 bool ScreensaverWindowFinder::ShouldStopIterating(XID window) {
23 if (!ui::IsWindowVisible(window) || !IsScreensaverWindow(window))
24 return false;
25 exists_ = true;
26 return true;
27 }
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 }
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 }