C#.Net form ekranında exe çalıştırma konusu bir çoÄŸumuzun merak ettiÄŸi hatta arayıp ta bulamadığı bir konudur. Bu yazımda c sharp programlama dilini kullanarak form içine gömülü exe uygulamalarını çalıştırmayı anlatacağım.
Ben Visual Studio 2010 kullanıyorum. Bu yazımda windows’un kendi hesap makinesini form içinde gömülü bir ÅŸekilde çalıştırmayı detaylı anlatacağım.
Öncelikle visual studio üzerinde yeni bir c# projesi açalım. Kaynak: www.mustafakarsli.com
Windows Form Application’ı seçerek Proje adını (ben execalistir yazdım) yazalım ve Ok butonuna basarak projemizi açalım.
Projemiz açıldıktan sonra form üzerine 1 adet buton ve 1 adet panel ekleyelim ve aÅŸağıdaki gibi düzenleyelim.

Formu düzenledikten sonra F7 tuÅŸuna basarak formun kod ekranını açalım ve aÅŸağıdaki kütüphaneleri kod ekranının üst kısmına (using kodlarının altına) ekleyelim. En üstteki benzer kodları göreceksiniz.
using System.IO;
using System.Diagnostics;
using System.Threading;
using System.Runtime.InteropServices;
Kütüphanelerimizi projemize ekledikten sonra gelelim dll kodlarını eklemeye; AÅŸağıda kütüphanelerin eklenmiÅŸ haliyle kod penceresinin görüntüsünü görüyoruz.

Buradaki form1 sınıfının altına yani 1 numaralı işaretli alana aşağıdaki kodları yazıyoruz. Herhangi bir değişiklik yapmadan yazınız.
[DllImport("user32.dll")]
static extern IntPtr SetParent(IntPtr child, IntPtr newParent);
[DllImport("user32.dll")]
static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool IsWindowVisible(IntPtr hWnd);
private const int WM_SYSCOMMAND = 274;
private const int SC_MAXIMIZE = 61488;
Kodları yazdıktan sonra buton nesnesinin click olayına uygulamayı çalıştırma kodunu ekleyeceÄŸiz. Butonun click olayını form tasarım ekranındayken buton üzerine iki kez tıklayarak açabiliriz. AÅŸağıda buton1’in click olayının kodunu tam veriyorum. AÅŸağıdaki kodları butonun click olayına yazalım.
privatevoid button1_Click(object sender, EventArgs e)
{
string exeyolu = "calc.exe";
Process calistir = Process.Start(exeyolu);
while (calistir.MainWindowHandle == IntPtr.Zero || !IsWindowVisible(calistir.MainWindowHandle))
{
System.Threading.Thread.Sleep(10);
calistir.Refresh();
}
Kaynak: www.mustafakarsli.com
calistir.WaitForInputIdle();
SetParent(calistir.MainWindowHandle, this.panel1.Handle);
SendMessage(calistir.MainWindowHandle, WM_SYSCOMMAND, SC_MAXIMIZE, 0);
}
Kaynak: www.mustafakarsli.com
Yukarıdaki kod ile programımız bitmiÅŸ oluyor. Buradaki dikkat edilmesi gereken açacağımız exe dosyasının adresini verdiÄŸimiz yerdir. Exe dosyasının adresini string exeyolu = "calc.exe";
satırıyla tanımlıyoruz. Buraya direk calc.exe yazdım tam adres beliritlmediÄŸi için program direk Windows/system32 klasörü içindeki uygulamalara bakıyor.
EÄŸer baÅŸka bir yerdeki uygulamayı çalıştırmak istiyorsanız. “C:\\Windows\\System32\\calc.exe” ÅŸeklinde adres verilmelidir.
Programımızı F5 ile derleyip çalıştıracak olursak sorunsuz bir ÅŸekilde çalıştığını göreceksiniz. Program çalıştıktan sonra butona tıklanıldığında hesap makinesinin gömülü olarak panel içinde açıldığını göreceksiniz.

Siz de uygulamaları çoÄŸaltabilirsiniz. Ben temel olarak bir exe ile anlattım. AÅŸağıda Programın tam kodunu görebilirsiniz.
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.IO;
using System.Diagnostics;
using System.Threading;
using System.Runtime.InteropServices;
namespace execalistir
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
[DllImport("user32.dll")]
static extern IntPtr SetParent(IntPtr child, IntPtr newParent);
[DllImport("user32.dll")]
static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool IsWindowVisible(IntPtr hWnd);
private const int WM_SYSCOMMAND = 274;
private const int SC_MAXIMIZE = 61488;
private void button1_Click(object sender, EventArgs e)
{
string exeyolu = "calc.exe";
Process calistir = Process.Start(exeyolu);
while (calistir.MainWindowHandle == IntPtr.Zero || !IsWindowVisible(calistir.MainWindowHandle))
{
System.Threading.Thread.Sleep(10);
calistir.Refresh();
}
calistir.WaitForInputIdle();
SetParent(calistir.MainWindowHandle, this.panel1.Handle);
SendMessage(calistir.MainWindowHandle, WM_SYSCOMMAND, SC_MAXIMIZE, 0);
}
}
}
Kaynak: www.mustafakarsli.com
İlerleyen günlerde yeni derslerde görüÅŸmek üzere saÄŸlıcakla kalınız.
Mustafa KARSLI Kaynak: www.mustafakarsli.com