Translate Blog

27 Ekim 2012 Cumartesi

C# ile Bilgisayar Uyku Modu Tespiti (Idle Time)

Birçok yerde aradım, bulamadım. Siz arayıp da bulamazsınız diye buraya koyuyorum ;) Bir kaç yöntem vardı aslında ama sanırım en basiti bu yöntem olsa gerek. Şu linkte bulunan kardeşler bizim için bir class hazırlamışlar. Bize de çöreklenmek düşer.

Bir uygulama hazırlıyorsunuz ve uygulamanız bilgisayar kullanılmadığı anı tespit etmesi gerekiyor, paylaşacağım örnekte ise bilgisayarın kullanılmadığı, farenin klavyenin basılmadığı süreleri sayıyor.

Aşağıdaki örnekte bir textbox var, timer var, listbox var. Using kısmına fazladan
using System.Runtime.InteropServices;
eklenmiş. Formunuza eklediyseniz aşağıdaki kodu olduğu gibi C# form koduna yapıştırın. Çalıştırdığınız zaman fare veya klavyeye dokunduğunuzda aşağı sayan sayılar tekrar sıfırlandığını göreceksiniz.

Class içinde bulunan Win32.GetIdleTime() ile o anki durumu alabiliyoruz, yani "bilgisayar boşta" durumunun süresini elde edebiliyoruz. Bir if ile rahatlıkla bu sınırı kendiniz belirleyebilirsiniz. Aşağıdaki örnekte bilgisayarın kullanılmadığı yaklaşık 1dk lık (60000) süre dolunca textbox'a Uyku modeu diye yazıyor.

Peki bu kodu nasıl kullanabilirsiniz, bilgisayarın uyku modunu siz ayarlayacaksınız, diyelim 10dk. Programınızda da bu süreyi belirteceksiniz, 10dk kadarlık süre geçtiyse ki bu yaklaşık 1014*60sn*10dk yaklaşık 600000 sayısı eder. bu sayıyı geçtiyse bilgisayar uyku moduna girmiştir yahu, kullanıcıyı uyarayım artık dedirtebilirsiniz.

Ben bunu nerede kullanacam ne işime yarayacak ki demeyin, bilgisayarlara kullanıcı girişi hazırlıyorsanız mysql ile kullanıcı kontrol girişli, ve adam çıkış yapmadan bilgisayardan kalktıysa boşta kalmasın pc, kullanıcı hesabını kapatsın diye yapabilirsiniz mesela. Eğer kodunu biliyorsanız belirlediğiniz sürede bilgisayarı kapatabilir, uykuya da alabilirsiniz.


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.Runtime.InteropServices;
//using Microsoft.Win32;
namespace uykuModu
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
       

private void timer1_Tick(object sender, EventArgs e)
        {
            listBox1.Items.Add(Win32.GetIdleTime().ToString());
            if (Win32.GetIdleTime() > 60000)
            {
                textBox1.Text = "UYKU MODUNA GEÇ";
            }
        }
    }


   // KLAVYE FARE HAREKETLERİ TESPİTİ
    internal struct LASTINPUTINFO
    {
        public uint cbSize;
        public uint dwTime;
    }
    public class Win32
    {
        [DllImport("User32.dll")]
        public static extern bool LockWorkStation();
        [DllImport("User32.dll")]
        private static extern bool GetLastInputInfo(ref LASTINPUTINFO plii);
        [DllImport("Kernel32.dll")]
        private static extern uint GetLastError();
        public static uint GetIdleTime()
        {
            LASTINPUTINFO lastInPut = new LASTINPUTINFO();
            lastInPut.cbSize = (uint)System.Runtime.InteropServices.Marshal.SizeOf(lastInPut);
            GetLastInputInfo(ref lastInPut);
            return ((uint)Environment.TickCount - lastInPut.dwTime);
        }
        public static long GetTickCount()
        {
            return Environment.TickCount;
        }
        public static long GetLastInputTime()
        {
            LASTINPUTINFO lastInPut = new LASTINPUTINFO();
            lastInPut.cbSize = (uint)System.Runtime.InteropServices.Marshal.SizeOf(lastInPut);
            if (!GetLastInputInfo(ref lastInPut))
            {
                throw new Exception(GetLastError().ToString());
            }
            return lastInPut.dwTime;
        }
    }
}
Yorum Gönder