読者です 読者をやめる 読者になる 読者になる

kur.jp

バイオリンと自転車をこよなく愛するkurのチラシの裏。たまには技術的なことを書いたりするかも知れません。

現在アクティブになっているウィンドウを取得する

C#で現在アクティブになってるウィンドウを取得したかったので,色々調べてみた.その結果,GetForegroundWindow関数を以下のように使うと良いらしいことがわかった.

こうすることで,プロセスの名前を取得することができるし,特定のウィンドウがアクティブになっているかどうかを確認することもできる.

IntPtr hWnd = GetForegroundWindow();
int id;
GetWindowThreadProcessId(hWnd, out id);
Process.GetProcessById(id).ProcessName
if (Process.GetProcessById(id).ProcessName == "XXXX") {

任意の処理

}

で,せっかくなので,一日に何秒ぐらいIRCを使っているかを調べるアプリを作ってみた.実行すると下記のような感じで,秒数を数えてくれる.このアプリを常時起動しておくことで,時間を意識ながら作業することができるようになる.はず.

Form1.cs

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;
using System.Runtime.InteropServices;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        [DllImport("user32.dll")]
        public static extern IntPtr GetForegroundWindow();
        [DllImport("user32.dll")]
        public static extern int GetWindowThreadProcessId(IntPtr hWnd, out int lpdwProcessId);

        public Form1()
        {
            InitializeComponent();
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            IntPtr hWnd = GetForegroundWindow();
            //int id;
            GetWindowThreadProcessId(hWnd, out id);
            if (Process.GetProcessById(id).ProcessName == "LimeChat2") {
                double a = (Math.Floor(double.Parse(label1.Text) * 10)+1)/10;
                label1.Text = a.ToString();
            }
        }
    }
}

s