Firefox扩展/插件-检测工作区已锁定

Firefox扩展/插件-检测工作区已锁定,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) 但我只允许我在进入睡眠状

我正在firefox插件中搜索解决方案,以检测用户工作区何时锁定/释放。google chrome中有一个简单的API
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文档页面上没有这样说,所以我可能找不到它)

      • 窗户

      • 苹果
        • 请参阅下面的屏幕保护程序部分,屏幕锁也通过该部分进行处理
  • ^%5B^\0%5D*%24&hitlimit=&tree=chromium

    • 我们在这个search results 2实现中看到,mac和windows似乎不支持linux,这很奇怪,因为chrome.idle页面在文档中没有提到这一点,也许我就是找不到它

      • windows实施:

      • mac实现:

总而言之:

[13:32]对于windows,其cake winapi的peice已调用以测试屏幕是否锁定或scrensaver是否正在运行

[13:32]mac电脑没有屏幕锁定测试。他们只有屏幕保护程序测试,但这是一个观察者的方法

[13:32]对于linux,他们没有屏幕锁定或屏幕保护程序测试。真奇怪。我会问那个家伙是否知道他们支持哪种操作系统

编辑:实际上我找到了linux实现。从以下搜索结果返回:
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   }