Bu yazımızda form ekranında exe çalıştırma yapacağız.
windows’un kendi hesap makinesini form içinde gömülü bir şekilde çalıştırmayı detaylı anlatacağım.
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 adresinistring 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.