Bu yazımızda bilgisayarımıza bağlı yazıcıları listeleyeceğiz. Seçilen yazıcıların üzerindeki görevleri alarak bu görevlerin silme işlemini gerçekleştireceğiz.

Merhaba, bu yazımızda bilgisayarımıza bağlı yazıcıları listeleyeceğiz. Seçilen yazıcıların üzerindeki görevleri alarak bu görevlerin silme işlemini gerçekleştireceğiz.

Böyle bir uygulamaya neden ihtiyaç duyarız. Sonuçta hangi uygulamada olursak olalım ctrl+p her türlü printer listesini çıkararak dökümanı print etmemizi sağlıyor zaten. Evet windows uygulamalarımızda yazıcı ve yazıcı üzerindeki görevler pek lazım olmuyor. Ancak local networkte çalışan bir mobil uygulama veya web uygulaması geliştirdiğimizde sunucu üzerindeki yazıcı listesine ihtiyacımız olabilir. Örneğin Android uygulamasında yazıcı listesi ve seçilen yazıcı üzerindeki görevleri listeleyerek bu yazıcılardaki görevleri silmemiz gerekebilir. Bu ve bunun gibi senaryolarda bu kodumuz lazım olabilir. 

Daha önceki yazılarımızda Tarayıcılar ile ilgili bir projemiz vardı. Bu projemiz ise yazıcılarla ilgili gelecek projelerimizde küçük çaplı bir muhasebe uygulamasına başlayacağız ve bu projelerin tamamını o projenin içerisinde toparlayacağız. Yine de yeni bir proje açarak örneğimize devam edelim. 

 

Projemiz üzerinde sağ click yapıp Add / New Folder ile Helper adında yeni bir klasör açalım ve bu klasörün içerisine PrinterHelper.cs adında bir class oluşturalım. Ardından projemize System.Management.dll i referans olarak ekleyelim.

Formumuzda yazıcıları ve görevlerini listeleyebileceğimiz bir listbox ve datagrid e ihtiyacımız var. Aynı zamanda bir toolstrip ekleyerek bu toolstrip üzerinde Yenile, Sil, tümünü sil ve programı kapat görevlerini atayabileceğimiz buttonlarımızı ekleyelim. 

Projemizi oluşturduktan sonra PrinterHelper.cs classına giderek önce printer listesini alacağımız fonksiyonumuzu yazalım. 

GetPrinterList

        public static List<string> GetPrinterList()
        {
            List<string> Printers = new List<string>();
            Printers = PrinterSettings.InstalledPrinters.OfType<string>().ToList();
            return Printers;
        }

PrinterSettings ile bilgisayarımızda kullanabileceğimiz kurulu tüm printer listesini alabiliyoruz. Bu listeyi farklı bir şekilde de alabilirdik.

Yazıcımız üzerindeki bekleyen görevleri alacağız. Bu görevlerin özelliklerine uygun bir class oluşturalım.  

PrinterQueue:

    public class PrinterQueue
    {
        public int JobId { get; set; }
        public string DocumentName { get; set; }
        public string JobStatus { get; set; }
        public int PagesPrinted { get; set; }
        public int TotalPages { get; set; }
        public PrinterQueue()
        {

        }
    }

Class ımızda görevin JobId sini alacağız. Döküman adını, statüsünü, yazdırılan sayfa ve toplam sayfa değerlerini tutabileceğimiz property lerimizi bu classın altında belirledik. Ardından seçilen yazıcının görevlerini alacağımız fonksiyonumuza geçebiliriz. 

GetPrinterQueues

        public static List<PrinterQueue> GetPrinterQueues(string printerName)
        {
            //Yazıcı Görevlerini atayabileceğimiz PrinterQueue list değişkenimizi oluşturuyoruz.
            List<PrinterQueue> PrinterQueues = new List<Helper.PrinterQueue>();
            // Ardından printer adına göre ManagementObjectSearcher a ilgili sorguyu göndererek burada bekleyen görevleri alıyoruz. 
            string searchQuery = "SELECT * FROM Win32_PrintJob Where Name Like '" + printerName + "%'";
            ManagementObjectSearcher searchPrintJobs = new ManagementObjectSearcher(searchQuery);
            ManagementObjectCollection printJobCollection = searchPrintJobs.Get();
            // Yazıcımızdaki tüm görevleri printJobCollection içerisinde aldık. 
            foreach (ManagementObject item in printJobCollection)
            {
                // item daki properties den görevler ile ilgili ayrıntıları değişkenimize aktarıyoruz. 
                PrinterQueue printerQueue = new Helper.PrinterQueue();
                printerQueue.JobId = Convert.ToInt32(item.Properties["JobId"].Value.ToString());
                printerQueue.DocumentName = item.Properties["Document"].Value.ToString() == null ? "" : item.Properties["Document"].Value.ToString();
                printerQueue.JobStatus = item.Properties["JobStatus"].Value == null ? "" : item.Properties["JobStatus"].Value.ToString();
                printerQueue.PagesPrinted = Convert.ToInt32(item.Properties["PagesPrinted"].Value.ToString());
                printerQueue.TotalPages = Convert.ToInt32(item.Properties["TotalPages"].Value.ToString());
                PrinterQueues.Add(printerQueue);
            }
            return PrinterQueues;
        }

Fonksiyonumuza dışarıdan yazıcı adını göndererek bu yazıcıdaki görevleri sorguladık ve bu görevleri oluşturduğumuz PrinterQueues listinin içerisine ekleyerek dışarı döndük. 

DelPrinterJob

Sıra bu classımız ile ilgili son olarak silmek istenen görev ile ilgili fonksiyonumuza geldi. Bunun için yazıcı adına ve jobId ye ihtiyacımız bulunuyor. Bu fonksiyonumuzda jobId -1 olarak gönderilirse tüm görevleri sileceğiz. jobId -1 değil ise belirtilen görevi sileceğiz.

        public static bool DelPrinterJob(string printerName, int jobId)
        {
            bool HasDeleted = false;
            string searchQuery = "SELECT * FROM Win32_PrintJob Where Name Like '" + printerName + "%'";
            ManagementObjectSearcher searchPrintJobs = new ManagementObjectSearcher(searchQuery);
            ManagementObjectCollection printJobCollection = searchPrintJobs.Get();

            foreach (ManagementObject printJob in printJobCollection)
            {
                if (jobId == -1)
                {
                    printJob.Delete();
                    HasDeleted = true;
                }
                else if (jobId == Convert.ToInt32(printJob.Properties["JobId"].Value.ToString()))
                {
                    printJob.Delete();
                    HasDeleted = true;
                }
            }
            return HasDeleted;
        }

PrintHelper.cs ile işimizi bitirdik. Şimdi formumuza geçebiliriz. 

DataBindPrinter:

Yazıcıları listeleyeceğimiz lstPrinters listbox ının Datasource ine PrinterHelper.GetPrinterList ten gelen yazıcı listesini bind ediyoruz. 

        private void DataBindPrinters()
        {
            lstPrinters.DataSource = Helper.PrinterHelper.GetPrinterList();
            lstPrinters.Refresh();
            DataBindPrinterQueues();
        }
DataBindPrinterQueues:
DataBindPrinterQueues fonksiyonumuz ile seçilen printer ın görevlerini grdPrinterQueues gridinin datasource une bind ediyoruz. Burada herhangi bir kayıt yok ise toolstrip imizdeki delete ve deleteall butonlarını disable ediyoruz. 
 
        private void DataBindPrinterQueues()
        {
            if (lstPrinters.SelectedItem != null)
            {
                string selectedItem = lstPrinters.SelectedItem.ToString();
                List<Helper.PrinterQueue> PrinterQueues = Helper.PrinterHelper.GetPrinterQueues(selectedItem);
                grdPrinterQueues.AutoGenerateColumns = false;
                grdPrinterQueues.DataSource = PrinterQueues;
                grdPrinterQueues.Refresh();
                if (PrinterQueues.Count > 0)
                {
                    toolDeleteQueue.Enabled = true;
                    toolDeleteAllQueues.Enabled = true;
                }
                else
                {
                    toolDeleteAllQueues.Enabled = false;
                    toolDeleteQueue.Enabled = false;
                }
            }
        }
InitializeEvent ile formumuzda bulunan tüm objelerin eventlarını subscribe ediyoruz. 
 
InitializeEvent:
        private void InitializeEvent()
        {
            lstPrinters.SelectedIndexChanged += lstPrinters_SelectedIndexChanged;
            toolRefreshPrinter.Click += toolRefreshPrinter_Click;
            toolDeleteQueue.Click += toolDeleteQueue_Click;
            toolDeleteAllQueues.Click += toolDeleteAllQueues_Click;
            toolExit.Click += toolExit_Click;
        }
 
SelectedIndexChanged:
Yazıcımızın listesinin olduğu listbox ta farklı bir yazıcı seçildiğinde o yazıcıya ait görevleri alabilmek için DataBindPrinterQueues fonksiyonuna gönderiyoruz. 
        private void lstPrinters_SelectedIndexChanged(object sender, EventArgs e)
        {
            DataBindPrinterQueues();
        }
toolRefreshPrinter_Click
Bu fonksiyonumuz ile refresh butonuna tıklandığında printer listesini aldığımız DataBindPrinters fonksiyonuna gönderiyoruz. 
        private void toolRefreshPrinter_Click(object sender, EventArgs e)
        {
            DataBindPrinters();
        }
DeleteQueue_Click:
Toolstripteki DeleteQueue butonuna tıklandığında önce seçili bir printer var mı kontrolü yapıyoruz. Ardından bu printer ın görevleri olup olmadığının kontrolünü yaptıktan sonra kullanıcıya görevi silmek istediğinize emin misiniz şeklinde onay sorusu soruyoruz. No olarak tıklanırsa return edip herhangi bir işlem yaptırmadan fonksiyondan çıkıyoruz. Kullanıcı seçili görevi silmek istiyorsa gridden jobId yi alarak PrinterHelper classımızdaki DelPrinterJob a gönderiyoruz. jobId -1 olmadığı için tek bir görev silinecek. Silme işlemi başarılı ise DataBindPrinterQueues() fonksiyonuna göndererek görevleri datagrid e yeniden bind ediyoruz. 
        private void toolDeleteQueue_Click(object sender, EventArgs e)
        {
            if (lstPrinters.SelectedItem != null)
            {
                string PrinterName = lstPrinters.SelectedItem.ToString();
                if (grdPrinterQueues.SelectedRows.Count > 0)
                {
                    if (MessageBox.Show("Yazıcıdaki " + grdPrinterQueues.SelectedRows[0].Cells[1].Value + " silmek istediğinize emin misiniz?", "Uyarı", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) == DialogResult.No)
                        return;
                    int jobId = Convert.ToInt32(grdPrinterQueues.SelectedRows[0].Cells[0].Value);
                    if (Helper.PrinterHelper.DelPrinterJob(PrinterName, jobId))
                    {
                        DataBindPrinterQueues();
                    }
                }

            }

        }
DeleteAllQueues_Click
Kullanıcı seçili yazıcının tüm görevlerini silmek isterse bu buton ile DelPrinterJob a yazıcı adını ve jobId yi -1 olarak göndererek yazıcıdaki tüm görevlerin silinmesini sağlıyoruz.
        private void toolDeleteAllQueues_Click(object sender, EventArgs e)
        {
            if (lstPrinters.SelectedItem != null)
            {
                if (MessageBox.Show("Yazıcıdaki tüm işleri silmek istediğinize emin misiniz?", "Uyarı", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) == DialogResult.No)
                    return;

                string PrinterName = lstPrinters.SelectedItem.ToString();
                if (Helper.PrinterHelper.DelPrinterJob(PrinterName, -1))
                {
                    DataBindPrinterQueues();
                }
            }
        }
toolExit_Click
Kullanıcı uygulamayı kapatmak istediğinde toolstrip teki exit butonunun onclick olayına uygulamayı sonlandıran kodumuzu ekliyoruz. 
        private void toolExit_Click(object sender, EventArgs e)
        {
            this.Close();
        }
 
Son olarak formumuzda DataBindPrinters ve InitializeEvent fonksiyonlarına göndererek formumuzdaki listbox, datagrid in verilerini yüklemesini ve butonların onclick olaylarının subscribe olmasını sağlıyoruz. 
        public frmPrinters()
        {
            InitializeComponent();
            DataBindPrinters();
            InitializeEvent();
        }
Uygulamamızı çalıştırdığımızda aşağıdaki gibi yazıcılarımızı ve buna bağlı görevleri listeleyecektir. 
 

İlgili Makaleler

Bu yazıya 0 yorum yapılmış.

Yorum Gönder