C Sharp 19.04.2013 👁 30808 Okunma

C Sharp Form İçinde Gömülü exe Çalıştırma

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.

C Sharp Buton ve Panel Ekleme

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.

Form1 Class Kod Ekranı

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.

C Sharp Formda exe Çalıştırma

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

👨‍💻

İçerik Yazarı

Mustafa KARSLI

Bilişim Teknolojileri Öğretmeni

Bu İçeriği Paylaş
f 𝕏

💬 Yorumlar

ibrahim27.01.2017 20.30.04

using System; using System.Diagnostics; using System.IO; using System.Windows.Forms; using System.Threading; namespace _22_03_Disk_Klasor_Dosya_Listleyici { public partial class Form1 : Form { public Form1() { InitializeComponent(); } DriveInfo drv; DirectoryInfo folder; string[] myDisks; TreeNode tNod; private object listBox1; private object selected; private object _listView; private object textbox1; private object yeniform; public object Items { get; private set; } private void Form1_Load(object sender, EventArgs e) { treeView1.ImageList = imgDisk; myDisks = Environment.GetLogicalDrives(); comboBox1.Items.AddRange(myDisks); DriveIcon(); } private void DriveIcon() { foreach (string item in myDisks) { drv = new DriveInfo(item); tNod = new TreeNode(drv.Name); switch (drv.DriveType) { case DriveType.CDRom: tNod.ImageIndex = 0; tNod.SelectedImageIndex = 0; break; case DriveType.Fixed: tNod.ImageIndex = 3; tNod.SelectedImageIndex = 3; break; case DriveType.Removable: tNod.ImageIndex = 4; tNod.SelectedImageIndex = 4; break; default: break; } tNod.Name = drv.Name; treeView1.Nodes.Add(tNod); } } private void treeView1_AfterSelect(object sender, TreeViewEventArgs e) { KlasorDosya(e.Node); } private void KlasorDosya(TreeNode treeNode) { treeNode.Nodes.Clear(); folder = new DirectoryInfo(treeNode.FullPath); if (folder.Exists) { int sayacKlasor = 0; try { foreach (DirectoryInfo item in folder.GetDirectories()) { treeNode.Nodes.Add(key: item.FullName, text: item.Name, imageIndex: 2); sayacKlasor++; } } catch { }; stripKlasor.Text = sayacKlasor + " adet klasör var."; } listView1.Clear(); listView1.Columns.Add("Dosya Adı"); listView1.Columns.Add("Oluşturulma Zamanı"); listView1.Columns.Add("Boyut"); listView1.View = View.Details; listView1.FullRowSelect = true; listView1.GridLines = true; if (folder.Exists) { int sayacDosya = 0; try { foreach (FileInfo item in folder.GetFiles()) { ListViewItem lvi = new ListViewItem(); lvi.Text = item.Name; lvi.SubItems.Add(item.CreationTime.ToLongDateString()); string boyutAdi; decimal boyut = BoyutCevir(item.Length, out boyutAdi); lvi.SubItems.Add(boyut.ToString("n5") + boyutAdi); listView1.Items.Add(lvi); sayacDosya++; } } catch { } stripDosya.Text = sayacDosya + " adet Dosya bulunmakta"; } listView1.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent); } ///

/// BoyutCevir decimal tipinde sonuç döndürür. /// /// Dosyanın boyutunu bayt cinsinden alır /// GB, MB, KB, Byte adlarını da out ile dışarı atar. /// Boyut tipine göre çevrilir ve decimal tipindedir. Boyut adı string /// tipinde dışarı atılır. public decimal BoyutCevir(decimal boyut, out string boyutAdi) { int kb = 1024; int mb = kb * 1024; int gb = mb * 1024; decimal sonuc = 0; if (boyut > gb) { sonuc = boyut / gb; boyutAdi = " GB"; } else if (boyut > mb) { sonuc = boyut / mb; boyutAdi = " MB"; } else if (boyut > kb) { sonuc = boyut / kb; boyutAdi = " KB"; } else { sonuc = boyut; boyutAdi = " B"; } return sonuc; } private void listView1_SelectedIndexChanged(object sender, EventArgs e) { ListViewItem item = listView1.SelectedItems[0]; textBox1.Text = item.SubItems[0].Text; } private void Açıver_Click(object sender, EventArgs e) { Form2 frm = new Form2(); Form2.yeniform = textbox1.text(); yeniform.Show(); Process çalıştır = Process.start(@"Program Files (x86)...exe"); while (çalıştır.mainWindowhandle == InPtr.Zero ! IsWindowVisible(çalıştır.mainWindowhandle)); { System.Threading.Thread.sleep(10); çalıştır.refresh(); } } private void textBox1_TextChanged(object sender, EventArgs e) { listView1.Items.Add(textBox1.Text); } } } kodumun tam hali nasıl hocam bi bakıp yanıtlarmısınız acaba tek sorunum istedeğim şey açılan 2. formda .exemi açablimek monitör eklesem form2 ye açılırmı diye deneyeceğim vs 2015 güncelleme alıyor biter bitmez deniyeceğim saygılarımla

ibrahim27.01.2017 20.27.02

private void listView1_SelectedIndexChanged(object sender, EventArgs e) { ListViewItem item = listView1.SelectedItems[0]; textBox1.Text = item.SubItems[0].Text; } private void Açıver_Click(object sender, EventArgs e) { Form2 frm = new Form2(); Form2.yeniform = textbox1.text(); yeniform.Show(); Process çalıştır = Process.start(@"Program Files (x86)...exe"); while (çalıştır.mainWindowhandle == InPtr.Zero ! IsWindowVisible(çalıştır.mainWindowhandle)); { System.Threading.Thread.sleep(10); çalıştır.refresh(); bi kodda benden olsun umarım arayanalrın işine yarar visual studyo codes debug yapılmıştır

erkan12.09.2016 19.20.47

tşkler cok güzel calışma actımız exeyı butonla tekrar kapatabilirmiyiz

mustafa türker20.08.2016 01.33.21

Allah razı olsun kardeşim cok güzel anlatmışsın ...YAZILARININ DEVAMINI BEKLERİZ SENİN GİBİ ARKADAŞLARA İHTİYAC VAR BU ÜLKEDE SİZİNLE İRTİBATA GECECEĞİMİZ MAİL ADRESİ PAYLAŞIRMISINIZ SAĞ OLUN VAR OLUN

Ömer21.04.2015 17.06.53

Merhaba. değerli bilgileriniz için çok teşekür ederim. lakin benim sorunum. devexpress kullanarak yapılmış bir programı panel içinde "doğru" çalışmaması. yani panel içinde bulunan "ürün ekle" dölümü çalışırken. "ürün listele" bölümü çalışmamakta. bunu neden yapar.

Yusuf BAYRAM01.03.2015 20.51.08

Gerçekten harika bi calisma olmuş bende nasıl yapacağımı düşünüyordum çok teşekkür ediyorum Allah yardımcınız olsun

Caner Gülgeç07.12.2014 04.04.19

Öncelikle bu değerli bilgi için teşekkürler. Yöntem hesap makinesi üzerinde işe yarıyor. Ancak office word 2013 üzerinde yapmayı başaramadım. Word önce gömülü açılmaya başlıyor ancak sonrasında kendisini dışarı atıyor. Bu durum için tavsiyelerinizz var mı?

Yakup Bozdaş17.07.2014 16.17.16

Elinize sağlık Mustafa Bey,çok yararlı hizmetler sunuyorsunuz. Bu emekleriniz için Allah c.c. sizlerden razı olsun..Selam ve Dua ile...

----- Mustafa KARSLI ---->
Teşekkür ederim Yakup Bey. Allah cümlemizden razı olsun inşaallah. Allah'a emanet. Selametle...

ayşe07.06.2014 03.10.34

mrb bana c#ta access tabanlı emlak otomasyonu lazm yardm edebılırmsnz

İlker02.03.2014 04.53.06

merhaba mustafa bey ben işlemlerinizi gerçekleştirdim fakat program açılışında önce şifre denetimi geliyor sonra guncelleme kontrolu daha sonra programın kendisi açılıyor ama form dışında açılmaktadır. bütün işlemleri nasıl formun içinde açabilirim sadece şifre denetim işlemi formun içerisinde açılmakta diğerleri ise formun dışında yer almaktadır. yardımlarınızı rica ederim.

----- Mustafa KARSLI ---->
İlker Bey tüm işlemleri ayrı ayrı panelde yapıp sonra panel gizle göster yaparak tek form üzerinde çalışabilirsiniz.

Murat27.11.2013 13.41.26

Ben WPF de çalıştırmak istiyorum fakat SetParent(calistir.MainWindowHandle, this.panell.AddHandler(); satırında hata alıyorum nasıl düzeltebilirim

----- Mustafa KARSLI ---->
hata aldığınız satırın sonu Handle olacak sanırım ondan. Çünkü AddHandler diye bir komut yok yukarıda.

Yakup TAŞLIBEYAZ31.05.2013 10.03.24

Gerçekten Çok Teşekkür Ederim

Fikrini Belirt

🤲 Günün Esması

el - HAYY

" Her zaman diri, tam ve mükemmel manasıyla hayat sahibi. "

💡 Günün Sözü

“Akrabaya, yoksula ve yolda kalmış yolcuya haklarını ver, fakat saçıp savurma. Çünkü saçıp savuranlar şeytanların kardeşleridir. Şeytan ise Rabbine karşı çok nankörlük etmiştir.”

İsrâ, 17/26-27

👋 Ben Kimim?

Geleceğimiz gençlerimize Bilim ve Teknolojiyi Üretmeleri için yol göstermeliyiz. Bu minvalde vakit buldukça ücretsiz ders ve videolar hazırlayıp yayınlamaya çalışmaktayım....

✉️ İletişime Geç

📈 Ziyaretçi Sayacı

Şu An Online
3
👥 Toplam Ziyaret
2.854.681

İstatistikler anlık güncellenir.