{"id":21,"date":"2026-08-05T14:18:21","date_gmt":"2026-08-05T06:18:21","guid":{"rendered":"https:\/\/neochung.app\/?p=21"},"modified":"2026-08-05T16:46:20","modified_gmt":"2026-08-05T08:46:20","slug":"wingnet-v2-1-1","status":"publish","type":"post","link":"https:\/\/blog.neochung.app\/index.php\/2026\/wingnet-v2-1-1\/","title":{"rendered":"Wingnet v2.1.1"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Wingnet \u662f\u4e00\u500b\u8996\u7a97\u5c0d\u9f4a\u5c0f\u5de5\u5177\uff0c\u900f\u904e Claude \u53ca Gemini \u5354\u4f5c\u5b8c\u6210\uff0c\u7a0b\u5f0f\u78bc\u7121\u9700\u6388\u6b0a\u5373\u53ef\u81ea\u7531\u8f49\u8f09\u3001\u4f7f\u7528\u8207\u6539\u5beb\uff0c\u4e0d\u5fc5\u53e6\u884c\u544a\u77e5\u3002<br>\u7a0b\u5f0f\u7684\u5716\u6a19\u900f\u904e python \u7a0b\u5f0f\u78bc\u7522\u751f\uff0c\u4e26\u6392\u9664\u4e86\u90e8\u4efd\u56e0\u97cc\u9ad4\u71b1\u9375\u7d81\u5b9a\u7684HOOK\u554f\u984c\u3002<br>Last updated: 2026\/7\/7<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro padding-bottom-disabled cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#EEFFFF;--cbp-line-number-width:calc(3 * 0.6 * .875rem);line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#212121\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#EEFFFF;display:none\" aria-label=\"\u8907\u88fd\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>#!\/usr\/bin\/env python3\n#\n# Built with the collaboration of Claude and Gemini.\n#\n# Copyright (c) 2026\n# Released under the MIT License.\n#\n\nimport ctypes\nimport ctypes.wintypes as wt\nimport sys\nimport threading\n\nfrom PIL import Image, ImageDraw\nimport pystray\n\nuser32   = ctypes.windll.user32\nkernel32 = ctypes.windll.kernel32\ndwmapi   = ctypes.windll.dwmapi\n\n\nclass KBDLLHOOKSTRUCT(ctypes.Structure):\n    _fields_ = &#91;\n        ('vkCode',      wt.DWORD),\n        ('scanCode',    wt.DWORD),\n        ('flags',       wt.DWORD),\n        ('time',        wt.DWORD),\n        ('dwExtraInfo', ctypes.c_ulong),\n    &#93;\n\n\nclass MONITORINFO(ctypes.Structure):\n    _fields_ = &#91;\n        ('cbSize',    wt.DWORD),\n        ('rcMonitor', wt.RECT),\n        ('rcWork',    wt.RECT),\n        ('dwFlags',   wt.DWORD),\n    &#93;\n\n\nclass WINDOWPLACEMENT(ctypes.Structure):\n    _fields_ = &#91;\n        ('length',           wt.UINT),\n        ('flags',            wt.UINT),\n        ('showCmd',          wt.UINT),\n        ('ptMinPosition',    wt.POINT),\n        ('ptMaxPosition',    wt.POINT),\n        ('rcNormalPosition', wt.RECT),\n    &#93;\n\n\nWH_KEYBOARD_LL           = 13\nWM_KEYDOWN               = 0x0100\nWM_SYSKEYDOWN            = 0x0104\nWM_QUIT                  = 0x0012\nHC_ACTION                = 0\n\nVK_CONTROL               = 0x11\nVK_LWIN                  = 0x5B\nVK_RWIN                  = 0x5C\n\nSW_RESTORE               = 9\nSW_MAXIMIZE              = 3\nSW_SHOWMAXIMIZED         = 3\nSWP_SHOWWINDOW           = 0x0040\nSWP_NOZORDER             = 0x0004\nMONITOR_DEFAULTTONEAREST = 0x00000002\nHIGH_PRIORITY_CLASS      = 0x00000080\nDWMWA_EXTENDED_FRAME_BOUNDS = 9\n\nHOTKEY_MAP: dict&#91;int, str&#93; = {\n    0x25: 'left_half',\n    0x27: 'right_half',\n    0x26: 'top_half',\n    0x28: 'bottom_half',\n    0x0D: 'maximize',\n    ord('C'): 'center',\n    ord('U'): 'top_left',\n    ord('I'): 'top_right',\n    ord('J'): 'bottom_left',\n    ord('K'): 'bottom_right',\n    ord('D'): 'left_third',\n    ord('F'): 'center_third',\n    ord('G'): 'right_third',\n    ord('E'): 'left_twothirds',\n    ord('T'): 'right_twothirds',\n\n    0x67: 'move_top_left',\n    0x24: 'move_top_left',\n    0x61: 'move_bottom_left',\n    0x23: 'move_bottom_left',\n    0x69: 'move_top_right',\n    0x21: 'move_top_right',\n    0x63: 'move_bottom_right',\n    0x22: 'move_bottom_right',\n}\n\n\ndef get_work_area(hwnd: int) -> tuple&#91;int, int, int, int&#93;:\n    monitor = user32.MonitorFromWindow(hwnd, MONITOR_DEFAULTTONEAREST)\n    mi = MONITORINFO()\n    mi.cbSize = ctypes.sizeof(MONITORINFO)\n    user32.GetMonitorInfoW(monitor, ctypes.byref(mi))\n    r = mi.rcWork\n    return r.left, r.top, r.right - r.left, r.bottom - r.top\n\n\ndef get_shadow_insets(hwnd: int) -> tuple&#91;int, int, int, int&#93;:\n    win_rect   = wt.RECT()\n    frame_rect = wt.RECT()\n    user32.GetWindowRect(hwnd, ctypes.byref(win_rect))\n    hr = dwmapi.DwmGetWindowAttribute(\n        hwnd,\n        DWMWA_EXTENDED_FRAME_BOUNDS,\n        ctypes.byref(frame_rect),\n        ctypes.sizeof(wt.RECT),\n    )\n    if hr != 0:\n        return 0, 0, 0, 0\n    return (\n        frame_rect.left   - win_rect.left,\n        frame_rect.top    - win_rect.top,\n        win_rect.right    - frame_rect.right,\n        win_rect.bottom   - frame_rect.bottom,\n    )\n\n\ndef place_window(hwnd: int, x: int, y: int, w: int, h: int, maximize: bool = False) -> None:\n    if maximize:\n        user32.ShowWindow(hwnd, SW_MAXIMIZE)\n        return\n    wp = WINDOWPLACEMENT()\n    wp.length = ctypes.sizeof(WINDOWPLACEMENT)\n    user32.GetWindowPlacement(hwnd, ctypes.byref(wp))\n    if wp.showCmd == SW_SHOWMAXIMIZED:\n        user32.ShowWindow(hwnd, SW_RESTORE)\n\n    sl, st, sr, sb = get_shadow_insets(hwnd)\n    user32.SetWindowPos(\n        hwnd, 0,\n        x - sl,\n        y - st,\n        w + sl + sr,\n        h + st + sb,\n        SWP_SHOWWINDOW | SWP_NOZORDER,\n    )\n\n\ndef execute_action(action: str) -> None:\n    hwnd = user32.GetForegroundWindow()\n    if not hwnd:\n        return\n    try:\n        ox, oy, ow, oh = get_work_area(hwnd)\n    except Exception:\n        return\n\n    hw = ow \/\/ 2\n    hh = oh \/\/ 2\n    t1 = ow \/\/ 3\n    t2 = ow * 2 \/\/ 3\n\n    layout: dict[str, tuple&#91;int, int, int, int&#93;] = {\n        'left_half':       (ox,          oy,         hw,          oh),\n        'right_half':      (ox + hw,     oy,         ow - hw,     oh),\n        'top_half':        (ox,          oy,         ow,          hh),\n        'bottom_half':     (ox,          oy + hh,    ow,          oh - hh),\n        'top_left':        (ox,          oy,         hw,          hh),\n        'top_right':       (ox + hw,     oy,         ow - hw,     hh),\n        'bottom_left':     (ox,          oy + hh,    hw,          oh - hh),\n        'bottom_right':    (ox + hw,     oy + hh,    ow - hw,     oh - hh),\n        'left_third':      (ox,          oy,         t1,          oh),\n        'center_third':    (ox + t1,     oy,         t2 - t1,     oh),\n        'right_third':     (ox + t2,     oy,         ow - t2,     oh),\n        'left_twothirds':  (ox,          oy,         t2,          oh),\n        'right_twothirds': (ox + t1,     oy,         ow - t1,     oh),\n    }\n\n    try:\n        if action == 'maximize':\n            place_window(hwnd, 0, 0, 0, 0, maximize=True)\n        elif action in ('center', 'move_top_left', 'move_bottom_left', 'move_top_right', 'move_bottom_right'):\n            win_rect = wt.RECT()\n            user32.GetWindowRect(hwnd, ctypes.byref(win_rect))\n            cur_w = win_rect.right - win_rect.left\n            cur_h = win_rect.bottom - win_rect.top\n            sl, st, sr, sb = get_shadow_insets(hwnd)\n            vw = cur_w - sl - sr\n            vh = cur_h - st - sb\n            if action == 'center':\n                cx = ox + (ow - vw) \/\/ 2\n                cy = oy + (oh - vh) \/\/ 2\n            elif action == 'move_top_left':\n                cx = ox\n                cy = oy\n            elif action == 'move_bottom_left':\n                cx = ox\n                cy = oy + oh - vh\n            elif action == 'move_top_right':\n                cx = ox + ow - vw\n                cy = oy\n            elif action == 'move_bottom_right':\n                cx = ox + ow - vw\n                cy = oy + oh - vh\n            place_window(hwnd, cx, cy, vw, vh)\n        elif action in layout:\n            place_window(hwnd, *layout&#91;action&#93;)\n    except Exception as exc:\n        print(f'&#91;Wingnet&#93; place_window error: {exc}', file=sys.stderr)\n\n\nLRESULT  = ctypes.c_longlong\n_WPARAM  = ctypes.c_ulonglong\n_LPARAM  = ctypes.c_longlong\n\n_LowLevelKeyboardProc = ctypes.WINFUNCTYPE(\n    LRESULT, ctypes.c_int, _WPARAM, _LPARAM\n)\n\nuser32.CallNextHookEx.restype  = LRESULT\nuser32.CallNextHookEx.argtypes = &#91;wt.HHOOK, ctypes.c_int, _WPARAM, _LPARAM&#93;\n\n_hook_handle:    int = 0\n_hook_proc_ref       = None\n_hook_thread_id: int = 0\n_hook_ready = threading.Event()\n\n\ndef _keyboard_proc(nCode: int, wParam: int, lParam: int) -> int:\n    if nCode == HC_ACTION and wParam in (WM_KEYDOWN, WM_SYSKEYDOWN):\n        kb   = ctypes.cast(lParam, ctypes.POINTER(KBDLLHOOKSTRUCT)).contents\n        vk   = kb.vkCode\n        ctrl = bool(user32.GetAsyncKeyState(VK_CONTROL) &amp; 0x8000)\n        win_ = (bool(user32.GetAsyncKeyState(VK_LWIN) &amp; 0x8000) or\n                bool(user32.GetAsyncKeyState(VK_RWIN) &amp; 0x8000))\n        if ctrl and win_ and vk in HOTKEY_MAP:\n            threading.Thread(\n                target=execute_action,\n                args=(HOTKEY_MAP&#91;vk&#93;,),\n                daemon=True,\n            ).start()\n            return 1\n    return user32.CallNextHookEx(_hook_handle, nCode, wParam, lParam)\n\n\ndef _hook_thread_func() -> None:\n    global _hook_handle, _hook_proc_ref, _hook_thread_id\n\n    _hook_thread_id = kernel32.GetCurrentThreadId()\n    _hook_proc_ref  = _LowLevelKeyboardProc(_keyboard_proc)\n    _hook_handle    = user32.SetWindowsHookExW(\n        WH_KEYBOARD_LL,\n        _hook_proc_ref,\n        None,\n        0,\n    )\n\n    if not _hook_handle:\n        err = kernel32.GetLastError()\n        print(f'&#91;Wingnet&#93; SetWindowsHookExW \u5931\u6557\uff0c\u932f\u8aa4\u78bc: {err}', file=sys.stderr)\n        _hook_ready.set()\n        return\n\n    _hook_ready.set()\n\n    msg = wt.MSG()\n    while user32.GetMessageW(ctypes.byref(msg), None, 0, 0) > 0:\n        user32.TranslateMessage(ctypes.byref(msg))\n        user32.DispatchMessageW(ctypes.byref(msg))\n\n    user32.UnhookWindowsHookEx(_hook_handle)\n\n\ndef stop_hook() -> None:\n    if _hook_thread_id:\n        user32.PostThreadMessageW(_hook_thread_id, WM_QUIT, 0, 0)\n\n\ndef _make_icon(size: int = 64) -> Image.Image:\n    img  = Image.new('RGBA', (size, size), (0, 0, 0, 0))\n    draw = ImageDraw.Draw(img)\n    s, m = size - 1, size \/\/ 2\n    c    = (80, 160, 255, 255)\n    draw.rectangle(&#91;2, 2, s - 2, s - 2&#93;, outline=c, width=3)\n    draw.line(&#91;m, 2, m, s - 2&#93;, fill=c, width=2)\n    draw.line(&#91;2, m, s - 2, m&#93;, fill=c, width=2)\n    draw.rectangle(&#91;4, 4, m - 2, m - 2&#93;, fill=(80, 160, 255, 100))\n    return img\n\n\n_MENU_ROWS = &#91;\n    ('Wingnet (v2.1.1)',               False),\n    (None, None),\n    ('\u2500\u2500 \u534a\u7248 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500',  False),\n    ('Ctrl+Win+\u2190    \u5de6\u534a',            False),\n    ('Ctrl+Win+\u2192    \u53f3\u534a',            False),\n    ('Ctrl+Win+\u2191    \u4e0a\u534a',            False),\n    ('Ctrl+Win+\u2193    \u4e0b\u534a',            False),\n    ('\u2500\u2500 \u6700\u5927\u5316 \/ \u7f6e\u4e2d \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500', False),\n    ('Ctrl+Win+Enter  \u6700\u5927\u5316',          False),\n    ('Ctrl+Win+C      \u7f6e\u4e2d (\u4e0d\u6539\u8b8a\u5927\u5c0f)', False),\n    ('\u2500\u2500 \u56db\u89d2\u5c0d\u9f4a (\u4e0d\u6539\u8b8a\u5927\u5c0f) \u2500\u2500\u2500\u2500\u2500', False),\n    ('Ctrl+Win+Num7  \u5c0d\u9f4a\u5de6\u4e0a',        False),\n    ('Ctrl+Win+Num9  \u5c0d\u9f4a\u53f3\u4e0a',        False),\n    ('Ctrl+Win+Num1  \u5c0d\u9f4a\u5de6\u4e0b',        False),\n    ('Ctrl+Win+Num3  \u5c0d\u9f4a\u53f3\u4e0b',        False),\n    ('\u2500\u2500 \u56db\u89d2 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500',  False),\n    ('Ctrl+Win+U    \u5de6\u4e0a\u89d2',           False),\n    ('Ctrl+Win+I    \u53f3\u4e0a\u89d2',           False),\n    ('Ctrl+Win+J    \u5de6\u4e0b\u89d2',           False),\n    ('Ctrl+Win+K    \u53f3\u4e0b\u89d2',           False),\n    ('\u2500\u2500 \u4e09\u7b49\u5206 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500',  False),\n    ('Ctrl+Win+D    \u5de6 \u2153',              False),\n    ('Ctrl+Win+F    \u4e2d \u2153',              False),\n    ('Ctrl+Win+G    \u53f3 \u2153',              False),\n    ('Ctrl+Win+E    \u5de6 \u2154',              False),\n    ('Ctrl+Win+T    \u53f3 \u2154',              False),\n    (None, None),\n    ('\u7d50\u675f Wingnet', True),\n&#93;\n\n\ndef _on_quit(icon: pystray.Icon, _item) -> None:\n    stop_hook()\n    icon.stop()\n\n\ndef create_tray_icon() -> pystray.Icon:\n    items = []\n    for label, clickable in _MENU_ROWS:\n        if label is None:\n            items.append(pystray.Menu.SEPARATOR)\n        elif clickable:\n            items.append(pystray.MenuItem(label, _on_quit))\n        else:\n            items.append(pystray.MenuItem(label, None, enabled=False))\n    return pystray.Icon('Wingnet', _make_icon(), 'Wingnet', pystray.Menu(*items))\n\n\ndef main() -> None:\n    try:\n        ctypes.windll.shcore.SetProcessDpiAwareness(2)\n    except OSError:\n        user32.SetProcessDPIAware()\n\n    kernel32.SetPriorityClass(kernel32.GetCurrentProcess(), HIGH_PRIORITY_CLASS)\n\n    hook_thread = threading.Thread(\n        target=_hook_thread_func, daemon=True, name='Wingnet-Hook'\n    )\n    hook_thread.start()\n    _hook_ready.wait(timeout=3)\n\n    if not _hook_handle:\n        print('&#91;Wingnet&#93; Hook \u5b89\u88dd\u5931\u6557\uff0c\u7a0b\u5f0f\u7d50\u675f\u3002', file=sys.stderr)\n        sys.exit(1)\n\n    icon = create_tray_icon()\n    icon.run()\n\n    stop_hook()\n    hook_thread.join(timeout=2)\n\n\nif __name__ == '__main__':\n    main()<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki material-theme-darker\" style=\"background-color: #212121\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #545454; font-style: italic\">#!\/usr\/bin\/env python3<\/span><\/span>\n<span class=\"line\"><span style=\"color: #545454; font-style: italic\">#<\/span><\/span>\n<span class=\"line\"><span style=\"color: #545454; font-style: italic\"># Built with the collaboration of Claude and Gemini.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #545454; font-style: italic\">#<\/span><\/span>\n<span class=\"line\"><span style=\"color: #545454; font-style: italic\"># Copyright (c) 2026<\/span><\/span>\n<span class=\"line\"><span style=\"color: #545454; font-style: italic\"># Released under the MIT License.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #545454; font-style: italic\">#<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF; font-style: italic\">import<\/span><span style=\"color: #EEFFFF\"> ctypes<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF; font-style: italic\">import<\/span><span style=\"color: #EEFFFF\"> ctypes<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #F07178\">wintypes<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF; font-style: italic\">as<\/span><span style=\"color: #EEFFFF\"> wt<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF; font-style: italic\">import<\/span><span style=\"color: #EEFFFF\"> sys<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF; font-style: italic\">import<\/span><span style=\"color: #EEFFFF\"> threading<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF; font-style: italic\">from<\/span><span style=\"color: #EEFFFF\"> PIL <\/span><span style=\"color: #89DDFF; font-style: italic\">import<\/span><span style=\"color: #EEFFFF\"> Image<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\"> ImageDraw<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF; font-style: italic\">import<\/span><span style=\"color: #EEFFFF\"> pystray<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">user32   <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> ctypes<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #F07178\">windll<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #F07178\">user32<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">kernel32 <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> ctypes<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #F07178\">windll<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #F07178\">kernel32<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">dwmapi   <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> ctypes<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #F07178\">windll<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #F07178\">dwmapi<\/span><\/span>\n<span class=\"line cbp-see-more-line \"><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C792EA\">class<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #FFCB6B\">KBDLLHOOKSTRUCT<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #FFCB6B\">ctypes<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #FFCB6B\">Structure<\/span><span style=\"color: #89DDFF\">):<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    _fields_ <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">&#91;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">vkCode<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\">      wt<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #F07178\">DWORD<\/span><span style=\"color: #89DDFF\">),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">scanCode<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\">    wt<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #F07178\">DWORD<\/span><span style=\"color: #89DDFF\">),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">flags<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\">       wt<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #F07178\">DWORD<\/span><span style=\"color: #89DDFF\">),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">time<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\">        wt<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #F07178\">DWORD<\/span><span style=\"color: #89DDFF\">),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">dwExtraInfo<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\"> ctypes<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #F07178\">c_ulong<\/span><span style=\"color: #89DDFF\">),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #89DDFF\">&#93;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C792EA\">class<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #FFCB6B\">MONITORINFO<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #FFCB6B\">ctypes<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #FFCB6B\">Structure<\/span><span style=\"color: #89DDFF\">):<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    _fields_ <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">&#91;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">cbSize<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\">    wt<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #F07178\">DWORD<\/span><span style=\"color: #89DDFF\">),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">rcMonitor<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\"> wt<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #F07178\">RECT<\/span><span style=\"color: #89DDFF\">),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">rcWork<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\">    wt<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #F07178\">RECT<\/span><span style=\"color: #89DDFF\">),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">dwFlags<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\">   wt<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #F07178\">DWORD<\/span><span style=\"color: #89DDFF\">),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #89DDFF\">&#93;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C792EA\">class<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #FFCB6B\">WINDOWPLACEMENT<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #FFCB6B\">ctypes<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #FFCB6B\">Structure<\/span><span style=\"color: #89DDFF\">):<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    _fields_ <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">&#91;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">length<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\">           wt<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #F07178\">UINT<\/span><span style=\"color: #89DDFF\">),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">flags<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\">            wt<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #F07178\">UINT<\/span><span style=\"color: #89DDFF\">),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">showCmd<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\">          wt<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #F07178\">UINT<\/span><span style=\"color: #89DDFF\">),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">ptMinPosition<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\">    wt<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #F07178\">POINT<\/span><span style=\"color: #89DDFF\">),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">ptMaxPosition<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\">    wt<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #F07178\">POINT<\/span><span style=\"color: #89DDFF\">),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">rcNormalPosition<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\"> wt<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #F07178\">RECT<\/span><span style=\"color: #89DDFF\">),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #89DDFF\">&#93;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">WH_KEYBOARD_LL           <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">13<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">WM_KEYDOWN               <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #C792EA\">0x<\/span><span style=\"color: #F78C6C\">0100<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">WM_SYSKEYDOWN            <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #C792EA\">0x<\/span><span style=\"color: #F78C6C\">0104<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">WM_QUIT                  <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #C792EA\">0x<\/span><span style=\"color: #F78C6C\">0012<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">HC_ACTION                <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">0<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">VK_CONTROL               <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #C792EA\">0x<\/span><span style=\"color: #F78C6C\">11<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">VK_LWIN                  <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #C792EA\">0x<\/span><span style=\"color: #F78C6C\">5B<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">VK_RWIN                  <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #C792EA\">0x<\/span><span style=\"color: #F78C6C\">5C<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">SW_RESTORE               <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">9<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">SW_MAXIMIZE              <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">3<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">SW_SHOWMAXIMIZED         <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">3<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">SWP_SHOWWINDOW           <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #C792EA\">0x<\/span><span style=\"color: #F78C6C\">0040<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">SWP_NOZORDER             <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #C792EA\">0x<\/span><span style=\"color: #F78C6C\">0004<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">MONITOR_DEFAULTTONEAREST <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #C792EA\">0x<\/span><span style=\"color: #F78C6C\">00000002<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">HIGH_PRIORITY_CLASS      <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #C792EA\">0x<\/span><span style=\"color: #F78C6C\">00000080<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">DWMWA_EXTENDED_FRAME_BOUNDS <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">9<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">HOTKEY_MAP<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\"> dict<\/span><span style=\"color: #89DDFF\">&#91;<\/span><span style=\"color: #FFCB6B\">int<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #FFCB6B\">str<\/span><span style=\"color: #89DDFF\">&#93;<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #C792EA\">0x<\/span><span style=\"color: #F78C6C\">25<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">left_half<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #89DDFF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #C792EA\">0x<\/span><span style=\"color: #F78C6C\">27<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">right_half<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #89DDFF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #C792EA\">0x<\/span><span style=\"color: #F78C6C\">26<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">top_half<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #89DDFF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #C792EA\">0x<\/span><span style=\"color: #F78C6C\">28<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">bottom_half<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #89DDFF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #C792EA\">0x<\/span><span style=\"color: #F78C6C\">0D<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">maximize<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #89DDFF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #82AAFF\">ord<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">C<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #89DDFF\">):<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">center<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #89DDFF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #82AAFF\">ord<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">U<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #89DDFF\">):<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">top_left<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #89DDFF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #82AAFF\">ord<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">I<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #89DDFF\">):<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">top_right<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #89DDFF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #82AAFF\">ord<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">J<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #89DDFF\">):<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">bottom_left<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #89DDFF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #82AAFF\">ord<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">K<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #89DDFF\">):<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">bottom_right<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #89DDFF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #82AAFF\">ord<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">D<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #89DDFF\">):<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">left_third<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #89DDFF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #82AAFF\">ord<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">F<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #89DDFF\">):<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">center_third<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #89DDFF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #82AAFF\">ord<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">G<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #89DDFF\">):<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">right_third<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #89DDFF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #82AAFF\">ord<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">E<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #89DDFF\">):<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">left_twothirds<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #89DDFF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #82AAFF\">ord<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">T<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #89DDFF\">):<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">right_twothirds<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #89DDFF\">,<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #C792EA\">0x<\/span><span style=\"color: #F78C6C\">67<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">move_top_left<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #89DDFF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #C792EA\">0x<\/span><span style=\"color: #F78C6C\">24<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">move_top_left<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #89DDFF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #C792EA\">0x<\/span><span style=\"color: #F78C6C\">61<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">move_bottom_left<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #89DDFF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #C792EA\">0x<\/span><span style=\"color: #F78C6C\">23<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">move_bottom_left<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #89DDFF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #C792EA\">0x<\/span><span style=\"color: #F78C6C\">69<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">move_top_right<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #89DDFF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #C792EA\">0x<\/span><span style=\"color: #F78C6C\">21<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">move_top_right<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #89DDFF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #C792EA\">0x<\/span><span style=\"color: #F78C6C\">63<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">move_bottom_right<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #89DDFF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #C792EA\">0x<\/span><span style=\"color: #F78C6C\">22<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">move_bottom_right<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #89DDFF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C792EA\">def<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">get_work_area<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF; font-style: italic\">hwnd<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #FFCB6B\">int<\/span><span style=\"color: #89DDFF\">)<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">-&gt;<\/span><span style=\"color: #EEFFFF\"> tuple<\/span><span style=\"color: #89DDFF\">&#91;<\/span><span style=\"color: #FFCB6B\">int<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #FFCB6B\">int<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #FFCB6B\">int<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #FFCB6B\">int<\/span><span style=\"color: #89DDFF\">&#93;:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    monitor <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> user32<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #82AAFF\">MonitorFromWindow<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF\">hwnd<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #82AAFF\"> MONITOR_DEFAULTTONEAREST<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    mi <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">MONITORINFO<\/span><span style=\"color: #89DDFF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    mi<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #F07178\">cbSize<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> ctypes<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #82AAFF\">sizeof<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF\">MONITORINFO<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    user32<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #82AAFF\">GetMonitorInfoW<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF\">monitor<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #82AAFF\"> ctypes<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #82AAFF\">byref<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF\">mi<\/span><span style=\"color: #89DDFF\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    r <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> mi<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #F07178\">rcWork<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #89DDFF; font-style: italic\">return<\/span><span style=\"color: #EEFFFF\"> r<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #F07178\">left<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\"> r<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #F07178\">top<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\"> r<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #F07178\">right<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">-<\/span><span style=\"color: #EEFFFF\"> r<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #F07178\">left<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\"> r<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #F07178\">bottom<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">-<\/span><span style=\"color: #EEFFFF\"> r<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #F07178\">top<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C792EA\">def<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">get_shadow_insets<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF; font-style: italic\">hwnd<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #FFCB6B\">int<\/span><span style=\"color: #89DDFF\">)<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">-&gt;<\/span><span style=\"color: #EEFFFF\"> tuple<\/span><span style=\"color: #89DDFF\">&#91;<\/span><span style=\"color: #FFCB6B\">int<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #FFCB6B\">int<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #FFCB6B\">int<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #FFCB6B\">int<\/span><span style=\"color: #89DDFF\">&#93;:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    win_rect   <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> wt<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #82AAFF\">RECT<\/span><span style=\"color: #89DDFF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    frame_rect <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> wt<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #82AAFF\">RECT<\/span><span style=\"color: #89DDFF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    user32<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #82AAFF\">GetWindowRect<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF\">hwnd<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #82AAFF\"> ctypes<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #82AAFF\">byref<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF\">win_rect<\/span><span style=\"color: #89DDFF\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    hr <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> dwmapi<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #82AAFF\">DwmGetWindowAttribute<\/span><span style=\"color: #89DDFF\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #82AAFF\">        hwnd<\/span><span style=\"color: #89DDFF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #82AAFF\">        DWMWA_EXTENDED_FRAME_BOUNDS<\/span><span style=\"color: #89DDFF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #82AAFF\">        ctypes<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #82AAFF\">byref<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF\">frame_rect<\/span><span style=\"color: #89DDFF\">),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #82AAFF\">        ctypes<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #82AAFF\">sizeof<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF\">wt<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #F07178\">RECT<\/span><span style=\"color: #89DDFF\">),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #82AAFF\">    <\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #89DDFF; font-style: italic\">if<\/span><span style=\"color: #EEFFFF\"> hr <\/span><span style=\"color: #89DDFF\">!=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #89DDFF\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF; font-style: italic\">return<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #89DDFF; font-style: italic\">return<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        frame_rect<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #F07178\">left<\/span><span style=\"color: #EEFFFF\">   <\/span><span style=\"color: #89DDFF\">-<\/span><span style=\"color: #EEFFFF\"> win_rect<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #F07178\">left<\/span><span style=\"color: #89DDFF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        frame_rect<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #F07178\">top<\/span><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #89DDFF\">-<\/span><span style=\"color: #EEFFFF\"> win_rect<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #F07178\">top<\/span><span style=\"color: #89DDFF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        win_rect<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #F07178\">right<\/span><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #89DDFF\">-<\/span><span style=\"color: #EEFFFF\"> frame_rect<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #F07178\">right<\/span><span style=\"color: #89DDFF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        win_rect<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #F07178\">bottom<\/span><span style=\"color: #EEFFFF\">   <\/span><span style=\"color: #89DDFF\">-<\/span><span style=\"color: #EEFFFF\"> frame_rect<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #F07178\">bottom<\/span><span style=\"color: #89DDFF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C792EA\">def<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">place_window<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF; font-style: italic\">hwnd<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #FFCB6B\">int<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #EEFFFF; font-style: italic\">x<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #FFCB6B\">int<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #EEFFFF; font-style: italic\">y<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #FFCB6B\">int<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #EEFFFF; font-style: italic\">w<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #FFCB6B\">int<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #EEFFFF; font-style: italic\">h<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #FFCB6B\">int<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #EEFFFF; font-style: italic\">maximize<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #FFCB6B\">bool<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">False)<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">-&gt;<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">None:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #89DDFF; font-style: italic\">if<\/span><span style=\"color: #EEFFFF\"> maximize<\/span><span style=\"color: #89DDFF\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        user32<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #82AAFF\">ShowWindow<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF\">hwnd<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #82AAFF\"> SW_MAXIMIZE<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF; font-style: italic\">return<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    wp <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">WINDOWPLACEMENT<\/span><span style=\"color: #89DDFF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    wp<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #F07178\">length<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> ctypes<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #82AAFF\">sizeof<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF\">WINDOWPLACEMENT<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    user32<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #82AAFF\">GetWindowPlacement<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF\">hwnd<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #82AAFF\"> ctypes<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #82AAFF\">byref<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF\">wp<\/span><span style=\"color: #89DDFF\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #89DDFF; font-style: italic\">if<\/span><span style=\"color: #EEFFFF\"> wp<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #F07178\">showCmd<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">==<\/span><span style=\"color: #EEFFFF\"> SW_SHOWMAXIMIZED<\/span><span style=\"color: #89DDFF\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        user32<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #82AAFF\">ShowWindow<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF\">hwnd<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #82AAFF\"> SW_RESTORE<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    sl<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\"> st<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\"> sr<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\"> sb <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">get_shadow_insets<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF\">hwnd<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    user32<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #82AAFF\">SetWindowPos<\/span><span style=\"color: #89DDFF\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #82AAFF\">        hwnd<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #82AAFF\"> <\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #89DDFF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #82AAFF\">        x <\/span><span style=\"color: #89DDFF\">-<\/span><span style=\"color: #82AAFF\"> sl<\/span><span style=\"color: #89DDFF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #82AAFF\">        y <\/span><span style=\"color: #89DDFF\">-<\/span><span style=\"color: #82AAFF\"> st<\/span><span style=\"color: #89DDFF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #82AAFF\">        w <\/span><span style=\"color: #89DDFF\">+<\/span><span style=\"color: #82AAFF\"> sl <\/span><span style=\"color: #89DDFF\">+<\/span><span style=\"color: #82AAFF\"> sr<\/span><span style=\"color: #89DDFF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #82AAFF\">        h <\/span><span style=\"color: #89DDFF\">+<\/span><span style=\"color: #82AAFF\"> st <\/span><span style=\"color: #89DDFF\">+<\/span><span style=\"color: #82AAFF\"> sb<\/span><span style=\"color: #89DDFF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #82AAFF\">        SWP_SHOWWINDOW <\/span><span style=\"color: #89DDFF\">|<\/span><span style=\"color: #82AAFF\"> SWP_NOZORDER<\/span><span style=\"color: #89DDFF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #82AAFF\">    <\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C792EA\">def<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">execute_action<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF; font-style: italic\">action<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #FFCB6B\">str<\/span><span style=\"color: #89DDFF\">)<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">-&gt;<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">None:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    hwnd <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> user32<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #82AAFF\">GetForegroundWindow<\/span><span style=\"color: #89DDFF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #89DDFF; font-style: italic\">if<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">not<\/span><span style=\"color: #EEFFFF\"> hwnd<\/span><span style=\"color: #89DDFF\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF; font-style: italic\">return<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #89DDFF; font-style: italic\">try<\/span><span style=\"color: #89DDFF\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        ox<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\"> oy<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\"> ow<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\"> oh <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">get_work_area<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF\">hwnd<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #89DDFF; font-style: italic\">except<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #FFCB6B\">Exception<\/span><span style=\"color: #89DDFF\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF; font-style: italic\">return<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    hw <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> ow <\/span><span style=\"color: #89DDFF\">\/\/<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">2<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    hh <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> oh <\/span><span style=\"color: #89DDFF\">\/\/<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">2<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    t1 <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> ow <\/span><span style=\"color: #89DDFF\">\/\/<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">3<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    t2 <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> ow <\/span><span style=\"color: #89DDFF\">*<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">2<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">\/\/<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">3<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    layout<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\"> dict<\/span><span style=\"color: #89DDFF\">[<\/span><span style=\"color: #FFCB6B\">str<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\"> tuple<\/span><span style=\"color: #89DDFF\">&#91;<\/span><span style=\"color: #FFCB6B\">int<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #FFCB6B\">int<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #FFCB6B\">int<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #FFCB6B\">int<\/span><span style=\"color: #89DDFF\">&#93;]<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">left_half<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\">       <\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">ox<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\">          oy<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\">         hw<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\">          oh<\/span><span style=\"color: #89DDFF\">),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">right_half<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\">      <\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">ox <\/span><span style=\"color: #89DDFF\">+<\/span><span style=\"color: #EEFFFF\"> hw<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\">     oy<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\">         ow <\/span><span style=\"color: #89DDFF\">-<\/span><span style=\"color: #EEFFFF\"> hw<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\">     oh<\/span><span style=\"color: #89DDFF\">),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">top_half<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">ox<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\">          oy<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\">         ow<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\">          hh<\/span><span style=\"color: #89DDFF\">),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">bottom_half<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\">     <\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">ox<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\">          oy <\/span><span style=\"color: #89DDFF\">+<\/span><span style=\"color: #EEFFFF\"> hh<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\">    ow<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\">          oh <\/span><span style=\"color: #89DDFF\">-<\/span><span style=\"color: #EEFFFF\"> hh<\/span><span style=\"color: #89DDFF\">),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">top_left<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">ox<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\">          oy<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\">         hw<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\">          hh<\/span><span style=\"color: #89DDFF\">),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">top_right<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\">       <\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">ox <\/span><span style=\"color: #89DDFF\">+<\/span><span style=\"color: #EEFFFF\"> hw<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\">     oy<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\">         ow <\/span><span style=\"color: #89DDFF\">-<\/span><span style=\"color: #EEFFFF\"> hw<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\">     hh<\/span><span style=\"color: #89DDFF\">),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">bottom_left<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\">     <\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">ox<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\">          oy <\/span><span style=\"color: #89DDFF\">+<\/span><span style=\"color: #EEFFFF\"> hh<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\">    hw<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\">          oh <\/span><span style=\"color: #89DDFF\">-<\/span><span style=\"color: #EEFFFF\"> hh<\/span><span style=\"color: #89DDFF\">),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">bottom_right<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">ox <\/span><span style=\"color: #89DDFF\">+<\/span><span style=\"color: #EEFFFF\"> hw<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\">     oy <\/span><span style=\"color: #89DDFF\">+<\/span><span style=\"color: #EEFFFF\"> hh<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\">    ow <\/span><span style=\"color: #89DDFF\">-<\/span><span style=\"color: #EEFFFF\"> hw<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\">     oh <\/span><span style=\"color: #89DDFF\">-<\/span><span style=\"color: #EEFFFF\"> hh<\/span><span style=\"color: #89DDFF\">),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">left_third<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\">      <\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">ox<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\">          oy<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\">         t1<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\">          oh<\/span><span style=\"color: #89DDFF\">),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">center_third<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">ox <\/span><span style=\"color: #89DDFF\">+<\/span><span style=\"color: #EEFFFF\"> t1<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\">     oy<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\">         t2 <\/span><span style=\"color: #89DDFF\">-<\/span><span style=\"color: #EEFFFF\"> t1<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\">     oh<\/span><span style=\"color: #89DDFF\">),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">right_third<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\">     <\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">ox <\/span><span style=\"color: #89DDFF\">+<\/span><span style=\"color: #EEFFFF\"> t2<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\">     oy<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\">         ow <\/span><span style=\"color: #89DDFF\">-<\/span><span style=\"color: #EEFFFF\"> t2<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\">     oh<\/span><span style=\"color: #89DDFF\">),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">left_twothirds<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\">  <\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">ox<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\">          oy<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\">         t2<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\">          oh<\/span><span style=\"color: #89DDFF\">),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">right_twothirds<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">ox <\/span><span style=\"color: #89DDFF\">+<\/span><span style=\"color: #EEFFFF\"> t1<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\">     oy<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\">         ow <\/span><span style=\"color: #89DDFF\">-<\/span><span style=\"color: #EEFFFF\"> t1<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\">     oh<\/span><span style=\"color: #89DDFF\">),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #89DDFF; font-style: italic\">try<\/span><span style=\"color: #89DDFF\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF; font-style: italic\">if<\/span><span style=\"color: #EEFFFF\"> action <\/span><span style=\"color: #89DDFF\">==<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">maximize<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #89DDFF\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #82AAFF\">place_window<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF\">hwnd<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #82AAFF\"> <\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #82AAFF\"> <\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #82AAFF\"> <\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #82AAFF\"> <\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #82AAFF\"> <\/span><span style=\"color: #EEFFFF; font-style: italic\">maximize<\/span><span style=\"color: #89DDFF\">=True)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF; font-style: italic\">elif<\/span><span style=\"color: #EEFFFF\"> action <\/span><span style=\"color: #89DDFF\">in<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">center<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">move_top_left<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">move_bottom_left<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">move_top_right<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">move_bottom_right<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #89DDFF\">):<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            win_rect <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> wt<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #82AAFF\">RECT<\/span><span style=\"color: #89DDFF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            user32<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #82AAFF\">GetWindowRect<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF\">hwnd<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #82AAFF\"> ctypes<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #82AAFF\">byref<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF\">win_rect<\/span><span style=\"color: #89DDFF\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            cur_w <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> win_rect<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #F07178\">right<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">-<\/span><span style=\"color: #EEFFFF\"> win_rect<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #F07178\">left<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            cur_h <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> win_rect<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #F07178\">bottom<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">-<\/span><span style=\"color: #EEFFFF\"> win_rect<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #F07178\">top<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            sl<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\"> st<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\"> sr<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\"> sb <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">get_shadow_insets<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF\">hwnd<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            vw <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> cur_w <\/span><span style=\"color: #89DDFF\">-<\/span><span style=\"color: #EEFFFF\"> sl <\/span><span style=\"color: #89DDFF\">-<\/span><span style=\"color: #EEFFFF\"> sr<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            vh <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> cur_h <\/span><span style=\"color: #89DDFF\">-<\/span><span style=\"color: #EEFFFF\"> st <\/span><span style=\"color: #89DDFF\">-<\/span><span style=\"color: #EEFFFF\"> sb<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #89DDFF; font-style: italic\">if<\/span><span style=\"color: #EEFFFF\"> action <\/span><span style=\"color: #89DDFF\">==<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">center<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #89DDFF\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                cx <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> ox <\/span><span style=\"color: #89DDFF\">+<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">ow <\/span><span style=\"color: #89DDFF\">-<\/span><span style=\"color: #EEFFFF\"> vw<\/span><span style=\"color: #89DDFF\">)<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">\/\/<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">2<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                cy <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> oy <\/span><span style=\"color: #89DDFF\">+<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">oh <\/span><span style=\"color: #89DDFF\">-<\/span><span style=\"color: #EEFFFF\"> vh<\/span><span style=\"color: #89DDFF\">)<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">\/\/<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">2<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #89DDFF; font-style: italic\">elif<\/span><span style=\"color: #EEFFFF\"> action <\/span><span style=\"color: #89DDFF\">==<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">move_top_left<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #89DDFF\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                cx <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> ox<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                cy <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> oy<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #89DDFF; font-style: italic\">elif<\/span><span style=\"color: #EEFFFF\"> action <\/span><span style=\"color: #89DDFF\">==<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">move_bottom_left<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #89DDFF\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                cx <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> ox<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                cy <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> oy <\/span><span style=\"color: #89DDFF\">+<\/span><span style=\"color: #EEFFFF\"> oh <\/span><span style=\"color: #89DDFF\">-<\/span><span style=\"color: #EEFFFF\"> vh<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #89DDFF; font-style: italic\">elif<\/span><span style=\"color: #EEFFFF\"> action <\/span><span style=\"color: #89DDFF\">==<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">move_top_right<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #89DDFF\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                cx <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> ox <\/span><span style=\"color: #89DDFF\">+<\/span><span style=\"color: #EEFFFF\"> ow <\/span><span style=\"color: #89DDFF\">-<\/span><span style=\"color: #EEFFFF\"> vw<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                cy <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> oy<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #89DDFF; font-style: italic\">elif<\/span><span style=\"color: #EEFFFF\"> action <\/span><span style=\"color: #89DDFF\">==<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">move_bottom_right<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #89DDFF\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                cx <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> ox <\/span><span style=\"color: #89DDFF\">+<\/span><span style=\"color: #EEFFFF\"> ow <\/span><span style=\"color: #89DDFF\">-<\/span><span style=\"color: #EEFFFF\"> vw<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                cy <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> oy <\/span><span style=\"color: #89DDFF\">+<\/span><span style=\"color: #EEFFFF\"> oh <\/span><span style=\"color: #89DDFF\">-<\/span><span style=\"color: #EEFFFF\"> vh<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #82AAFF\">place_window<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF\">hwnd<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #82AAFF\"> cx<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #82AAFF\"> cy<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #82AAFF\"> vw<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #82AAFF\"> vh<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF; font-style: italic\">elif<\/span><span style=\"color: #EEFFFF\"> action <\/span><span style=\"color: #89DDFF\">in<\/span><span style=\"color: #EEFFFF\"> layout<\/span><span style=\"color: #89DDFF\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #82AAFF\">place_window<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF\">hwnd<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #82AAFF\"> <\/span><span style=\"color: #89DDFF\">*<\/span><span style=\"color: #82AAFF\">layout<\/span><span style=\"color: #89DDFF\">&#91;<\/span><span style=\"color: #82AAFF\">action<\/span><span style=\"color: #89DDFF\">&#93;)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #89DDFF; font-style: italic\">except<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #FFCB6B\">Exception<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF; font-style: italic\">as<\/span><span style=\"color: #EEFFFF\"> exc<\/span><span style=\"color: #89DDFF\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #82AAFF\">print<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #C792EA\">f<\/span><span style=\"color: #C3E88D\">&#39;&#91;Wingnet&#93; place_window error: <\/span><span style=\"color: #F78C6C\">{<\/span><span style=\"color: #82AAFF\">exc<\/span><span style=\"color: #F78C6C\">}<\/span><span style=\"color: #C3E88D\">&#39;<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #82AAFF\"> <\/span><span style=\"color: #EEFFFF; font-style: italic\">file<\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #82AAFF\">sys<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #F07178\">stderr<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">LRESULT  <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> ctypes<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #F07178\">c_longlong<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">_WPARAM  <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> ctypes<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #F07178\">c_ulonglong<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">_LPARAM  <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> ctypes<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #F07178\">c_longlong<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">_LowLevelKeyboardProc <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> ctypes<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #82AAFF\">WINFUNCTYPE<\/span><span style=\"color: #89DDFF\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #82AAFF\">    LRESULT<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #82AAFF\"> ctypes<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #F07178\">c_int<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #82AAFF\"> _WPARAM<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #82AAFF\"> _LPARAM<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">user32<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #F07178\">CallNextHookEx<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #F07178\">restype<\/span><span style=\"color: #EEFFFF\">  <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> LRESULT<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">user32<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #F07178\">CallNextHookEx<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #F07178\">argtypes<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">&#91;<\/span><span style=\"color: #EEFFFF\">wt<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #F07178\">HHOOK<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\"> ctypes<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #F07178\">c_int<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\"> _WPARAM<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\"> _LPARAM<\/span><span style=\"color: #89DDFF\">&#93;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">_hook_handle<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #FFCB6B\">int<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">_hook_proc_ref       <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">None<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">_hook_thread_id<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #FFCB6B\">int<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">_hook_ready <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> threading<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #82AAFF\">Event<\/span><span style=\"color: #89DDFF\">()<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C792EA\">def<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">_keyboard_proc<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF; font-style: italic\">nCode<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #FFCB6B\">int<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #EEFFFF; font-style: italic\">wParam<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #FFCB6B\">int<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #EEFFFF; font-style: italic\">lParam<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #FFCB6B\">int<\/span><span style=\"color: #89DDFF\">)<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">-&gt;<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #FFCB6B\">int<\/span><span style=\"color: #89DDFF\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #89DDFF; font-style: italic\">if<\/span><span style=\"color: #EEFFFF\"> nCode <\/span><span style=\"color: #89DDFF\">==<\/span><span style=\"color: #EEFFFF\"> HC_ACTION <\/span><span style=\"color: #89DDFF\">and<\/span><span style=\"color: #EEFFFF\"> wParam <\/span><span style=\"color: #89DDFF\">in<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">WM_KEYDOWN<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\"> WM_SYSKEYDOWN<\/span><span style=\"color: #89DDFF\">):<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        kb   <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> ctypes<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #82AAFF\">cast<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF\">lParam<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #82AAFF\"> ctypes<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #82AAFF\">POINTER<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF\">KBDLLHOOKSTRUCT<\/span><span style=\"color: #89DDFF\">)).<\/span><span style=\"color: #F07178\">contents<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        vk   <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> kb<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #F07178\">vkCode<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        ctrl <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #FFCB6B\">bool<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF\">user32<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #82AAFF\">GetAsyncKeyState<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF\">VK_CONTROL<\/span><span style=\"color: #89DDFF\">)<\/span><span style=\"color: #82AAFF\"> <\/span><span style=\"color: #89DDFF\">&amp;<\/span><span style=\"color: #82AAFF\"> <\/span><span style=\"color: #C792EA\">0x<\/span><span style=\"color: #F78C6C\">8000<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        win_ <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #FFCB6B\">bool<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF\">user32<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #82AAFF\">GetAsyncKeyState<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF\">VK_LWIN<\/span><span style=\"color: #89DDFF\">)<\/span><span style=\"color: #82AAFF\"> <\/span><span style=\"color: #89DDFF\">&amp;<\/span><span style=\"color: #82AAFF\"> <\/span><span style=\"color: #C792EA\">0x<\/span><span style=\"color: #F78C6C\">8000<\/span><span style=\"color: #89DDFF\">)<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">or<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                <\/span><span style=\"color: #FFCB6B\">bool<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF\">user32<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #82AAFF\">GetAsyncKeyState<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF\">VK_RWIN<\/span><span style=\"color: #89DDFF\">)<\/span><span style=\"color: #82AAFF\"> <\/span><span style=\"color: #89DDFF\">&amp;<\/span><span style=\"color: #82AAFF\"> <\/span><span style=\"color: #C792EA\">0x<\/span><span style=\"color: #F78C6C\">8000<\/span><span style=\"color: #89DDFF\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF; font-style: italic\">if<\/span><span style=\"color: #EEFFFF\"> ctrl <\/span><span style=\"color: #89DDFF\">and<\/span><span style=\"color: #EEFFFF\"> win_ <\/span><span style=\"color: #89DDFF\">and<\/span><span style=\"color: #EEFFFF\"> vk <\/span><span style=\"color: #89DDFF\">in<\/span><span style=\"color: #EEFFFF\"> HOTKEY_MAP<\/span><span style=\"color: #89DDFF\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            threading<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #82AAFF\">Thread<\/span><span style=\"color: #89DDFF\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #82AAFF\">                <\/span><span style=\"color: #EEFFFF; font-style: italic\">target<\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #82AAFF\">execute_action<\/span><span style=\"color: #89DDFF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #82AAFF\">                <\/span><span style=\"color: #EEFFFF; font-style: italic\">args<\/span><span style=\"color: #89DDFF\">=(<\/span><span style=\"color: #82AAFF\">HOTKEY_MAP<\/span><span style=\"color: #89DDFF\">&#91;<\/span><span style=\"color: #82AAFF\">vk<\/span><span style=\"color: #89DDFF\">&#93;,),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #82AAFF\">                <\/span><span style=\"color: #EEFFFF; font-style: italic\">daemon<\/span><span style=\"color: #89DDFF\">=True,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #82AAFF\">            <\/span><span style=\"color: #89DDFF\">).<\/span><span style=\"color: #82AAFF\">start<\/span><span style=\"color: #89DDFF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #89DDFF; font-style: italic\">return<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #89DDFF; font-style: italic\">return<\/span><span style=\"color: #EEFFFF\"> user32<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #82AAFF\">CallNextHookEx<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF\">_hook_handle<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #82AAFF\"> nCode<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #82AAFF\"> wParam<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #82AAFF\"> lParam<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C792EA\">def<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">_hook_thread_func<\/span><span style=\"color: #89DDFF\">()<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">-&gt;<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">None:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #C792EA\">global<\/span><span style=\"color: #EEFFFF\"> _hook_handle<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\"> _hook_proc_ref<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\"> _hook_thread_id<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    _hook_thread_id <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> kernel32<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #82AAFF\">GetCurrentThreadId<\/span><span style=\"color: #89DDFF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    _hook_proc_ref  <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">_LowLevelKeyboardProc<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF\">_keyboard_proc<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    _hook_handle    <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> user32<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #82AAFF\">SetWindowsHookExW<\/span><span style=\"color: #89DDFF\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #82AAFF\">        WH_KEYBOARD_LL<\/span><span style=\"color: #89DDFF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #82AAFF\">        _hook_proc_ref<\/span><span style=\"color: #89DDFF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #82AAFF\">        <\/span><span style=\"color: #89DDFF\">None,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #82AAFF\">        <\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #89DDFF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #82AAFF\">    <\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #89DDFF; font-style: italic\">if<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">not<\/span><span style=\"color: #EEFFFF\"> _hook_handle<\/span><span style=\"color: #89DDFF\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        err <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> kernel32<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #82AAFF\">GetLastError<\/span><span style=\"color: #89DDFF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #82AAFF\">print<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #C792EA\">f<\/span><span style=\"color: #C3E88D\">&#39;&#91;Wingnet&#93; SetWindowsHookExW \u5931\u6557\uff0c\u932f\u8aa4\u78bc: <\/span><span style=\"color: #F78C6C\">{<\/span><span style=\"color: #82AAFF\">err<\/span><span style=\"color: #F78C6C\">}<\/span><span style=\"color: #C3E88D\">&#39;<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #82AAFF\"> <\/span><span style=\"color: #EEFFFF; font-style: italic\">file<\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #82AAFF\">sys<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #F07178\">stderr<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        _hook_ready<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #82AAFF\">set<\/span><span style=\"color: #89DDFF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF; font-style: italic\">return<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    _hook_ready<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #82AAFF\">set<\/span><span style=\"color: #89DDFF\">()<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    msg <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> wt<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #82AAFF\">MSG<\/span><span style=\"color: #89DDFF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #89DDFF; font-style: italic\">while<\/span><span style=\"color: #EEFFFF\"> user32<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #82AAFF\">GetMessageW<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF\">ctypes<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #82AAFF\">byref<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF\">msg<\/span><span style=\"color: #89DDFF\">),<\/span><span style=\"color: #82AAFF\"> <\/span><span style=\"color: #89DDFF\">None,<\/span><span style=\"color: #82AAFF\"> <\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #82AAFF\"> <\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #89DDFF\">)<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">&gt;<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #89DDFF\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        user32<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #82AAFF\">TranslateMessage<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF\">ctypes<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #82AAFF\">byref<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF\">msg<\/span><span style=\"color: #89DDFF\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        user32<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #82AAFF\">DispatchMessageW<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF\">ctypes<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #82AAFF\">byref<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF\">msg<\/span><span style=\"color: #89DDFF\">))<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    user32<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #82AAFF\">UnhookWindowsHookEx<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF\">_hook_handle<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C792EA\">def<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">stop_hook<\/span><span style=\"color: #89DDFF\">()<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">-&gt;<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">None:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #89DDFF; font-style: italic\">if<\/span><span style=\"color: #EEFFFF\"> _hook_thread_id<\/span><span style=\"color: #89DDFF\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        user32<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #82AAFF\">PostThreadMessageW<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF\">_hook_thread_id<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #82AAFF\"> WM_QUIT<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #82AAFF\"> <\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #82AAFF\"> <\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C792EA\">def<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">_make_icon<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF; font-style: italic\">size<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #FFCB6B\">int<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">64<\/span><span style=\"color: #89DDFF\">)<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">-&gt;<\/span><span style=\"color: #EEFFFF\"> Image<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #F07178\">Image<\/span><span style=\"color: #89DDFF\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    img  <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> Image<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #82AAFF\">new<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">RGBA<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #82AAFF\"> <\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF\">size<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #82AAFF\"> size<\/span><span style=\"color: #89DDFF\">),<\/span><span style=\"color: #82AAFF\"> <\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #82AAFF\"> <\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #82AAFF\"> <\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #82AAFF\"> <\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #89DDFF\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    draw <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> ImageDraw<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #82AAFF\">Draw<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF\">img<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    s<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\"> m <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> size <\/span><span style=\"color: #89DDFF\">-<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">1<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\"> size <\/span><span style=\"color: #89DDFF\">\/\/<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">2<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    c    <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #F78C6C\">80<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">160<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">255<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">255<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    draw<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #82AAFF\">rectangle<\/span><span style=\"color: #89DDFF\">(&#91;<\/span><span style=\"color: #F78C6C\">2<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #82AAFF\"> <\/span><span style=\"color: #F78C6C\">2<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #82AAFF\"> s <\/span><span style=\"color: #89DDFF\">-<\/span><span style=\"color: #82AAFF\"> <\/span><span style=\"color: #F78C6C\">2<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #82AAFF\"> s <\/span><span style=\"color: #89DDFF\">-<\/span><span style=\"color: #82AAFF\"> <\/span><span style=\"color: #F78C6C\">2<\/span><span style=\"color: #89DDFF\">&#93;,<\/span><span style=\"color: #82AAFF\"> <\/span><span style=\"color: #EEFFFF; font-style: italic\">outline<\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #82AAFF\">c<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #82AAFF\"> <\/span><span style=\"color: #EEFFFF; font-style: italic\">width<\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #F78C6C\">3<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    draw<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #82AAFF\">line<\/span><span style=\"color: #89DDFF\">(&#91;<\/span><span style=\"color: #82AAFF\">m<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #82AAFF\"> <\/span><span style=\"color: #F78C6C\">2<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #82AAFF\"> m<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #82AAFF\"> s <\/span><span style=\"color: #89DDFF\">-<\/span><span style=\"color: #82AAFF\"> <\/span><span style=\"color: #F78C6C\">2<\/span><span style=\"color: #89DDFF\">&#93;,<\/span><span style=\"color: #82AAFF\"> <\/span><span style=\"color: #EEFFFF; font-style: italic\">fill<\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #82AAFF\">c<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #82AAFF\"> <\/span><span style=\"color: #EEFFFF; font-style: italic\">width<\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #F78C6C\">2<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    draw<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #82AAFF\">line<\/span><span style=\"color: #89DDFF\">(&#91;<\/span><span style=\"color: #F78C6C\">2<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #82AAFF\"> m<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #82AAFF\"> s <\/span><span style=\"color: #89DDFF\">-<\/span><span style=\"color: #82AAFF\"> <\/span><span style=\"color: #F78C6C\">2<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #82AAFF\"> m<\/span><span style=\"color: #89DDFF\">&#93;,<\/span><span style=\"color: #82AAFF\"> <\/span><span style=\"color: #EEFFFF; font-style: italic\">fill<\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #82AAFF\">c<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #82AAFF\"> <\/span><span style=\"color: #EEFFFF; font-style: italic\">width<\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #F78C6C\">2<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    draw<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #82AAFF\">rectangle<\/span><span style=\"color: #89DDFF\">(&#91;<\/span><span style=\"color: #F78C6C\">4<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #82AAFF\"> <\/span><span style=\"color: #F78C6C\">4<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #82AAFF\"> m <\/span><span style=\"color: #89DDFF\">-<\/span><span style=\"color: #82AAFF\"> <\/span><span style=\"color: #F78C6C\">2<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #82AAFF\"> m <\/span><span style=\"color: #89DDFF\">-<\/span><span style=\"color: #82AAFF\"> <\/span><span style=\"color: #F78C6C\">2<\/span><span style=\"color: #89DDFF\">&#93;,<\/span><span style=\"color: #82AAFF\"> <\/span><span style=\"color: #EEFFFF; font-style: italic\">fill<\/span><span style=\"color: #89DDFF\">=(<\/span><span style=\"color: #F78C6C\">80<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #82AAFF\"> <\/span><span style=\"color: #F78C6C\">160<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #82AAFF\"> <\/span><span style=\"color: #F78C6C\">255<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #82AAFF\"> <\/span><span style=\"color: #F78C6C\">100<\/span><span style=\"color: #89DDFF\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #89DDFF; font-style: italic\">return<\/span><span style=\"color: #EEFFFF\"> img<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">_MENU_ROWS <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">&#91;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">Wingnet (v2.1.1)<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\">               <\/span><span style=\"color: #89DDFF\">False),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #89DDFF\">(None,<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">None),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">\u2500\u2500 \u534a\u7248 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\">  <\/span><span style=\"color: #89DDFF\">False),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">Ctrl+Win+\u2190    \u5de6\u534a<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #89DDFF\">False),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">Ctrl+Win+\u2192    \u53f3\u534a<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #89DDFF\">False),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">Ctrl+Win+\u2191    \u4e0a\u534a<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #89DDFF\">False),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">Ctrl+Win+\u2193    \u4e0b\u534a<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #89DDFF\">False),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">\u2500\u2500 \u6700\u5927\u5316 \/ \u7f6e\u4e2d \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">False),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">Ctrl+Win+Enter  \u6700\u5927\u5316<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\">          <\/span><span style=\"color: #89DDFF\">False),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">Ctrl+Win+C      \u7f6e\u4e2d (\u4e0d\u6539\u8b8a\u5927\u5c0f)<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">False),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">\u2500\u2500 \u56db\u89d2\u5c0d\u9f4a (\u4e0d\u6539\u8b8a\u5927\u5c0f) \u2500\u2500\u2500\u2500\u2500<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">False),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">Ctrl+Win+Num7  \u5c0d\u9f4a\u5de6\u4e0a<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF\">False),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">Ctrl+Win+Num9  \u5c0d\u9f4a\u53f3\u4e0a<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF\">False),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">Ctrl+Win+Num1  \u5c0d\u9f4a\u5de6\u4e0b<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF\">False),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">Ctrl+Win+Num3  \u5c0d\u9f4a\u53f3\u4e0b<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF\">False),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">\u2500\u2500 \u56db\u89d2 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\">  <\/span><span style=\"color: #89DDFF\">False),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">Ctrl+Win+U    \u5de6\u4e0a\u89d2<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\">           <\/span><span style=\"color: #89DDFF\">False),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">Ctrl+Win+I    \u53f3\u4e0a\u89d2<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\">           <\/span><span style=\"color: #89DDFF\">False),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">Ctrl+Win+J    \u5de6\u4e0b\u89d2<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\">           <\/span><span style=\"color: #89DDFF\">False),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">Ctrl+Win+K    \u53f3\u4e0b\u89d2<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\">           <\/span><span style=\"color: #89DDFF\">False),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">\u2500\u2500 \u4e09\u7b49\u5206 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\">  <\/span><span style=\"color: #89DDFF\">False),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">Ctrl+Win+D    \u5de6 \u2153<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\">              <\/span><span style=\"color: #89DDFF\">False),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">Ctrl+Win+F    \u4e2d \u2153<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\">              <\/span><span style=\"color: #89DDFF\">False),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">Ctrl+Win+G    \u53f3 \u2153<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\">              <\/span><span style=\"color: #89DDFF\">False),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">Ctrl+Win+E    \u5de6 \u2154<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\">              <\/span><span style=\"color: #89DDFF\">False),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">Ctrl+Win+T    \u53f3 \u2154<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\">              <\/span><span style=\"color: #89DDFF\">False),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #89DDFF\">(None,<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">None),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">\u7d50\u675f Wingnet<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">True),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">&#93;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C792EA\">def<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">_on_quit<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF; font-style: italic\">icon<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\"> pystray<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #F07178\">Icon<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #EEFFFF; font-style: italic\">_item<\/span><span style=\"color: #89DDFF\">)<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">-&gt;<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">None:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #82AAFF\">stop_hook<\/span><span style=\"color: #89DDFF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    icon<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #82AAFF\">stop<\/span><span style=\"color: #89DDFF\">()<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C792EA\">def<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">create_tray_icon<\/span><span style=\"color: #89DDFF\">()<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">-&gt;<\/span><span style=\"color: #EEFFFF\"> pystray<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #F07178\">Icon<\/span><span style=\"color: #89DDFF\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    items <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">[]<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #89DDFF; font-style: italic\">for<\/span><span style=\"color: #EEFFFF\"> label<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #EEFFFF\"> clickable <\/span><span style=\"color: #89DDFF; font-style: italic\">in<\/span><span style=\"color: #EEFFFF\"> _MENU_ROWS<\/span><span style=\"color: #89DDFF\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF; font-style: italic\">if<\/span><span style=\"color: #EEFFFF\"> label <\/span><span style=\"color: #89DDFF\">is<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">None:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            items<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #82AAFF\">append<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF\">pystray<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #F07178\">Menu<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #F07178\">SEPARATOR<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF; font-style: italic\">elif<\/span><span style=\"color: #EEFFFF\"> clickable<\/span><span style=\"color: #89DDFF\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            items<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #82AAFF\">append<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF\">pystray<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #82AAFF\">MenuItem<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF\">label<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #82AAFF\"> _on_quit<\/span><span style=\"color: #89DDFF\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF; font-style: italic\">else<\/span><span style=\"color: #89DDFF\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            items<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #82AAFF\">append<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF\">pystray<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #82AAFF\">MenuItem<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF\">label<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #82AAFF\"> <\/span><span style=\"color: #89DDFF\">None,<\/span><span style=\"color: #82AAFF\"> <\/span><span style=\"color: #EEFFFF; font-style: italic\">enabled<\/span><span style=\"color: #89DDFF\">=False))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #89DDFF; font-style: italic\">return<\/span><span style=\"color: #EEFFFF\"> pystray<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #82AAFF\">Icon<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">Wingnet<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #82AAFF\"> _make_icon<\/span><span style=\"color: #89DDFF\">(),<\/span><span style=\"color: #82AAFF\"> <\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">Wingnet<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #82AAFF\"> pystray<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #82AAFF\">Menu<\/span><span style=\"color: #89DDFF\">(*<\/span><span style=\"color: #82AAFF\">items<\/span><span style=\"color: #89DDFF\">))<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C792EA\">def<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">main<\/span><span style=\"color: #89DDFF\">()<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">-&gt;<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">None:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #89DDFF; font-style: italic\">try<\/span><span style=\"color: #89DDFF\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        ctypes<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #F07178\">windll<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #F07178\">shcore<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #82AAFF\">SetProcessDpiAwareness<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #F78C6C\">2<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #89DDFF; font-style: italic\">except<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #FFCB6B\">OSError<\/span><span style=\"color: #89DDFF\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        user32<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #82AAFF\">SetProcessDPIAware<\/span><span style=\"color: #89DDFF\">()<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    kernel32<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #82AAFF\">SetPriorityClass<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF\">kernel32<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #82AAFF\">GetCurrentProcess<\/span><span style=\"color: #89DDFF\">(),<\/span><span style=\"color: #82AAFF\"> HIGH_PRIORITY_CLASS<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    hook_thread <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> threading<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #82AAFF\">Thread<\/span><span style=\"color: #89DDFF\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #82AAFF\">        <\/span><span style=\"color: #EEFFFF; font-style: italic\">target<\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #82AAFF\">_hook_thread_func<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #82AAFF\"> <\/span><span style=\"color: #EEFFFF; font-style: italic\">daemon<\/span><span style=\"color: #89DDFF\">=True,<\/span><span style=\"color: #82AAFF\"> <\/span><span style=\"color: #EEFFFF; font-style: italic\">name<\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">Wingnet-Hook<\/span><span style=\"color: #89DDFF\">&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #82AAFF\">    <\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    hook_thread<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #82AAFF\">start<\/span><span style=\"color: #89DDFF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    _hook_ready<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #82AAFF\">wait<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF; font-style: italic\">timeout<\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #F78C6C\">3<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #89DDFF; font-style: italic\">if<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">not<\/span><span style=\"color: #EEFFFF\"> _hook_handle<\/span><span style=\"color: #89DDFF\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #82AAFF\">print<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">&#91;Wingnet&#93; Hook \u5b89\u88dd\u5931\u6557\uff0c\u7a0b\u5f0f\u7d50\u675f\u3002<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #82AAFF\"> <\/span><span style=\"color: #EEFFFF; font-style: italic\">file<\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #82AAFF\">sys<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #F07178\">stderr<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        sys<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #82AAFF\">exit<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #F78C6C\">1<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    icon <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">create_tray_icon<\/span><span style=\"color: #89DDFF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    icon<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #82AAFF\">run<\/span><span style=\"color: #89DDFF\">()<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #82AAFF\">stop_hook<\/span><span style=\"color: #89DDFF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    hook_thread<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #82AAFF\">join<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF; font-style: italic\">timeout<\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #F78C6C\">2<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF; font-style: italic\">if<\/span><span style=\"color: #EEFFFF\"> __name__ <\/span><span style=\"color: #89DDFF\">==<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">__main__<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #89DDFF\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #82AAFF\">main<\/span><span style=\"color: #89DDFF\">()<\/span><\/span><\/code><\/pre><span style=\"display:flex;align-items:flex-end;padding:10px;width:100%;justify-content:flex-start;background-color:#212121;color:#d5ffff;font-size:12px;line-height:1;position:relative\">Python<\/span><div class=\"cbp-see-more-container\" data-see-more-collapse-string=\"\u6536\u5408\" data-see-more-string=\"\u5c55\u958b\" style=\"display:flex;flex-direction:column;align-items:center;width:100%;font-size:12px;line-height:1;position:relative;padding-top:0;margin-bottom:0;height:0\"><span role=\"button\" tabindex=\"0\" class=\"cbp-see-more-simple-btn cbp-see-more-simple-btn-hover\" style=\"color:#ffffff;background-color:#3b3b3b;padding:6px 14px;cursor:default;position:relative;border-radius:6px;transform:translateY(-50%)\">\u5c55\u958b<\/span><\/div><\/div>\n\n\n<p class=\"wp-block-tag-cloud\"><a href=\"https:\/\/blog.neochung.app\/index.php\/tag\/python\/\" class=\"tag-cloud-link tag-link-5 tag-link-position-1\" style=\"font-size: 8pt;\" aria-label=\"Python (1 \u500b\u9805\u76ee)\">Python<\/a>\n<a href=\"https:\/\/blog.neochung.app\/index.php\/tag\/windowsapp\/\" class=\"tag-cloud-link tag-link-6 tag-link-position-2\" style=\"font-size: 8pt;\" aria-label=\"WindowsApp (1 \u500b\u9805\u76ee)\">WindowsApp<\/a><\/p>","protected":false},"excerpt":{"rendered":"<p>Wingnet \u662f\u4e00\u500b\u8996\u7a97\u5c0d\u9f4a\u5c0f\u5de5\u5177\uff0c\u900f\u904e Claude \u53ca Gemini \u5354\u4f5c\u5b8c\u6210\uff0c\u7a0b\u5f0f\u78bc\u7121\u9700\u6388\u6b0a\u5373\u53ef\u81ea\u7531\u8f49 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":37,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[5,6],"class_list":["post-21","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-python","tag-python","tag-windowsapp"],"blocksy_meta":[],"_links":{"self":[{"href":"https:\/\/blog.neochung.app\/index.php\/wp-json\/wp\/v2\/posts\/21","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.neochung.app\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.neochung.app\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.neochung.app\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.neochung.app\/index.php\/wp-json\/wp\/v2\/comments?post=21"}],"version-history":[{"count":14,"href":"https:\/\/blog.neochung.app\/index.php\/wp-json\/wp\/v2\/posts\/21\/revisions"}],"predecessor-version":[{"id":41,"href":"https:\/\/blog.neochung.app\/index.php\/wp-json\/wp\/v2\/posts\/21\/revisions\/41"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.neochung.app\/index.php\/wp-json\/wp\/v2\/media\/37"}],"wp:attachment":[{"href":"https:\/\/blog.neochung.app\/index.php\/wp-json\/wp\/v2\/media?parent=21"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.neochung.app\/index.php\/wp-json\/wp\/v2\/categories?post=21"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.neochung.app\/index.php\/wp-json\/wp\/v2\/tags?post=21"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}