C# ile başka uygulamayı yönetmek ve MATLAB ve Turist Ömer ve Tetris üzerine

C# içinden başka uygulamaları yönetmek bazı durumlarda gerekebilir. En yaygın olarak kullanılan yöntem, diğer uygulamaya mouse olayı ya da tuş (keystroke) göndermek. Aslında daha profesyonel yöntemler de mevcut, bu tür profesyonel yöntemlerin son zamanlarda kumar sitelerinde otomatik oyuncu olarak kullanılmakta olduğuna şahit oluyorum (BOT)

Yapay görme teknikleri ile birlikte çok güzel ve profesyonel  BOTlar yazılabilir. Mesela bende takıntı oldu, ne zaman bir CAPTCHA görsem, onun görüntü işleme teknikleri ile kolay kırılıp kırılamayacağına göz atarım ilkin.  (Sanırım bu yüzden captcha lar da gelişti. Etkileşimkli sorular türemeye başladı. Kutucuk içindeki yazıyı şuraya yazın vs. değil de, Türkiyenin başkenti neresidir? gibi sorulara cevap vermemizi istiyorlar. Karşıda insan olup olmadığını anlamanın güzel bir yolu. Bu tür sorulara da cevap verebilecek bir yapay zeka uygulaması geliştirilebilir mi mesela. Ya da Turist Ömerin bilgisayara sorduğu “Kompeter naber? (direk deadlock), 2 x 2 ? toto sonuçları? attırıbıttın mı? (zzzztt erenköy) ” gibi soruları geldi aklıma. ) Neyse konuyu çok dağıtmadan yapay görme kullanan bir BOT a kafa yoralım. Pek ala sanal bir okey oynayıcısı olabilir bu. Gerçi, o tür oyun sitelerinde, yapay görme ye girmeden, atılan taşın/kartın değeri zaten bir yerde listeleniyor.

“Ali Kırmızı 4 Attı” gibi.

Burada metin incelenerek (text parser) sanal kullanıcı kimin hangi taşı attığını bulabilir. Bizim işimiz yapay görme olduğuna göre, programımız atılan iskambil kağıdını tanıyabilir (mesela Kupa-7) gibi…

Boş bir anımda bu tür bir uygulama yazıp, Las Vegas sanal web casino’larına dadansam nasıl olur acaba…

Biz artık işin teknik kısmına gelelim. Şu, basit dediğimiz kısmına. Bir başka uygulamaya keystroke gönderme üzerine bir örnek yapalım. Web de bu konuda yerli yabancı tonla örnek var ama ben burada en kısa ve en basitini yazmak istiyorum.

Uygulamamız, windows hesap makinası ile bir hesaplama (8 faktöriyel) yaptırıp, işlem sonucunu alıp kendi başlığında gösteren bir uygulama olsun. Uygulama, hesap makinasını (calc.exe) çalıştırıyor, ardından 8! ve Ctrl + C gönderiyor. Windows hesap makinesi 8! sonucunu bulup ekranına yazıyor ve en son bu değeri clipboard a kopyalıyor. Uygulamamız Hafızada hazırlop hesaplanmış değeri alıyor ve kendi başlık alanında görüntülüyor. Artık ihtiyacı kalmadığından hesap makinasını da kapatıyor. (Böyle birşey ne işe yarar demeyin, bu mantık genişletilerek pek çok uygulama alanı bulunabilir. Üstelik pure multiprocess…)

İşin kod kısmını olabildiğince sadeleştirerek yaptım ki, kodu okuyan herkes anlasın, açıklamaya gerek bile kalmasın.

İşte bütün kod

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

namespace WindowsApplication12
{
	public partial class Form1 : Form
	{

		[DllImport("user32.dll")]
		public static extern bool SetForegroundWindow(IntPtr hWnd);

		public Form1()
		{
			InitializeComponent();
		}

		private void button1_Click(object sender, EventArgs e)
		{
			// Burada hesap makinasını çalıştıralım
			// dilenirse parametrelerle oynanarak görünmez (invisible/hidden) olarak açılabilir
			Process p = Process.Start("calc.exe");

			// Şimdi calc.exe tam olarak yüklendi mi bekleyelim...
			while (p.MainWindowHandle == IntPtr.Zero)
			{
				System.Threading.Thread.Sleep(10);
				p.Refresh();
			}

			// Eğer yüklenmiş ise
			if (p.MainWindowHandle != IntPtr.Zero)
			{
				// Hafızayı temizleyelim. Birazdan hesap makinası dolduracak
				Clipboard.Clear();
				SetForegroundWindow(p.MainWindowHandle);
				System.Windows.Forms.SendKeys.Send("8!^C");	

				// Hafızada Text tipinde veri olana kadar bekleyelim
				while (!Clipboard.ContainsText())
				{
					System.Threading.Thread.Sleep(10);
					Application.DoEvents();
				}

				// Hafızadaki text tipi veriyi alalım ve pencerenin başlığına yazalım
				String clipText = Clipboard.GetData(DataFormats.Text).ToString();
				Text = clipText;

				// Hesap makinasını kapatabiliriz artık
				p.Kill();
			}
			else MessageBox.Show("Uygulama Bulunamadı!");
		}
	}
}

uygulamanın sorunsuz çalışması lazım. Ben Windows Vista da, VS 2005 kullanarak derledim bir sorun çıkmadı.

Burada asıl işi yapan
System.Windows.Forms.SendKeys.Send(“8!^C”);

fonksiyonu. Bunun SendWait versiyonu da var. gönderim bitene kadar uygulamayı bekler. Bazı durumlarda daha sağlıklı çalışabilir.

Ama asıl önemli olan, App.config dosyasında bir değişiklik yapmanız gerektiğidir. Normalde App.Config dosyası VS içinde default olarak oluşturulmaz. Manual oluşturmanız lazım ve içine

<appSettings>

<add key=”SendKeys” value=”SendInput”/>

</appSettings>

ifadelerini girmelisiniz. Bunu yapmak için VS içinden  Add New Item diyalog kutusuna tıklayıp Application Configuration File şablonunu seçip Add düğmesini tıklarsanız XML formatında ve herhangi bir seçenek içermeyen App.Config dosyası hazırlanır. Bunun içine yukarıda bahsettiğim 3 satırı girmeniz yeterlidir.

Bendeki App.Config şu şekilde

<?xml version=”1.0″ encoding=”utf-8″ ?>
<configuration>
<appSettings>
<add key=”SendKeys” value=”SendInput”/>
</appSettings>
</configuration>

<?xml version=”1.0″ encoding=”utf-8″ ?><configuration>  <appSettings>    <add key=”SendKeys” value=”SendInput”/>  </appSettings></configuration>

Gecenin yarısı bu makaleyi yazmama sebep olan olay, Hüseyin’in Matlab ile yaptığı o güzel ses-işlem (voice processing) uygulamalarına C# içinden erişmenin 1001 yolundan bir diğerine kafa yormaktı 😉  Proje, ses komutuyla tetris oynamaktı. Sol, Sağ, Dön, Aşağı komutları ile tetris oynamak gerçekten de eğlenceli olabilir. Gerçi bu yolla rekor yapılabilir mi bilmem. Sol sol sol soll…. derken, MATLAB o kadar hızlı process edebilecek mi acaba?

Yavaştır MATLAB yavaş… 😉 😉 😉

Hüseyin buradan sana sesleniyorum, direk MATLAB ile yazılmış Tetris uygulamaları var. Free. Downloadable. Bunlardan bi tane indir, yine Matlab içinden sesle yönet.

Ben de, kameraya el hareketleri ile yön bildirip tetris oynatayım. Bakalım hangisi daha kullanışlı olacak.

Ya da ortaya Hybrid bir versiyon çıkartalım. Sesli, görsel, dokunsal, duygusal Tetris. Hmmm…İyi Fikir. Budur.

C# ile başka uygulamayı yönetmek ve MATLAB ve Turist Ömer ve Tetris üzerine” üzerine 4 düşünce

  1. s.a matlap da ses işleyerek pic16f877 ile serve motor kontrolü yapmam gerekiyor ama ses işleme hakkında neredeyse hiç bir fikrim yok yardımcı olabilirseniz çok sevinirim şimdiden çok teşekkür ederim hayırlı aksamlar

  2. uygulamayı kod ile çalıştırmadan, mevcut açık bir uygulamaya tuş kodları gönderme işini nasıl yapabiliriz peki hocam? bu konuda yardımcı olabilir misin?

  3. Merhaba Bir konu hakkında bı sey sorcagım. Yazdıgınız kod iyi guzel calısıyor fakat bu uygulama acık butona tekrar tıkladım ıkıncı kez calıstırıyor. Bunu nasıl engelleriz mesela hesap makınesı calısırken tıklandı butona calısan uygulamayı ekranın ust kısmına nasıl getırırz ?

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir