LoginSignup
79
107

More than 3 years have passed since last update.

Pythonを使ってWindowsやMacを監視し、操作中のアプリの情報を収集してみる

Last updated at Posted at 2020-10-10

はじめに

お家で仕事することが多くなり、多くの人が「みんなきちんと家で仕事してるのか?」という不安を抱えているという話を聞いています。

そもそも不安になること自体がおかしいことかなと思いますが、上司が不安になると自分が困ることになる人もいるのかなと思ったりもします。

ということで、パソコンを使っている時にリアルタイムで使用しているアプリの情報を収集できればその不安も少しは低減できるのではないかと考え、方法を検討してみました。

ここでは、「アクティブウィンドウを変更するたびにアクティブウインドウのタイトルを取得して表示する」という方法をまとめてみます。

動作環境

  • macOS Move
  • Windows10 Pro
  • Python3.7

ライブラリのインストール

Macを操作するライブラリ

Macの方は以下のコマンドで必要なライブラリをインストールして下さい。

pip install -U PyObjC

Windowsを操作するライブラリ

Windowsの方は以下のコマンドで必要なライブラリをインストールして下さい。

pip install -U pywin32

スクリプトの作成

get_active_window_title.py
#!/usr/bin/env python

import sys

# Mac用
if sys.platform == "darwin":
    from AppKit import NSWorkspace
    from Quartz import (
        CGWindowListCopyWindowInfo,
        kCGWindowListOptionOnScreenOnly,
        kCGNullWindowID
    )

    def getActiveWindowTitle():
    
        curr_app = NSWorkspace.sharedWorkspace().frontmostApplication()
        curr_pid = NSWorkspace.sharedWorkspace().activeApplication()['NSApplicationProcessIdentifier']
        curr_app_name = curr_app.localizedName()
        options = kCGWindowListOptionOnScreenOnly
        windowList = CGWindowListCopyWindowInfo(options, kCGNullWindowID)
        
        txt = ""
        
        for window in windowList:
            pid = window['kCGWindowOwnerPID']
            windowNumber = window['kCGWindowNumber']
            ownerName = window['kCGWindowOwnerName']
            geometry = window['kCGWindowBounds']
            windowTitle = window.get('kCGWindowName', u'Unknown')
            
            if curr_pid == pid:
                activeWindowTitle = ownerName + " - " + windowTitle

        return activeWindowTitle

# Windows用
elif sys.platform == "win32":
    import win32gui

    def getActiveWindowTitle():
        
        activeWindowTitle = win32gui.GetWindowText(win32gui.GetForegroundWindow());
        return activeWindowTitle

else:
    def getActiveWindowTitle():
        return ""
    
def main():
    bufWindowTitle = ""
    
    try:
        while True:
            activeWindowTitle = getActiveWindowTitle()
            if bufWindowTitle != activeWindowTitle:
                print(activeWindowTitle)
                bufWindowTitle = activeWindowTitle
    except KeyboardInterrupt:
        sys.exit(0)
        
if __name__ == '__main__':
    main()

実行

作成したら以下のコマンドで実行します。

python get_active_window_title.py

アクティブウィンドウを切り替えるたびにアプリケーション名が表示されるはずです。

できた!

これを指定したサーバーに送信するようにすれば自分がきちんと仕事をしていることがきちんとわかり、「証明しろ!」って言われても大丈夫!!
...大丈夫!
......大丈夫だと思う。

79
107
5

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
79
107