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.
- Yazılım Uzmanları
- 13 Mayıs 2018
- 260 kez görüntülendi.
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();
}
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;
}
}
}
private void InitializeEvent()
{
lstPrinters.SelectedIndexChanged += lstPrinters_SelectedIndexChanged;
toolRefreshPrinter.Click += toolRefreshPrinter_Click;
toolDeleteQueue.Click += toolDeleteQueue_Click;
toolDeleteAllQueues.Click += toolDeleteAllQueues_Click;
toolExit.Click += toolExit_Click;
}
private void lstPrinters_SelectedIndexChanged(object sender, EventArgs e)
{
DataBindPrinterQueues();
}
private void toolRefreshPrinter_Click(object sender, EventArgs e) { DataBindPrinters(); }
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();
}
}
}
}
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(); } } }
private void toolExit_Click(object sender, EventArgs e) { this.Close(); }
public frmPrinters() { InitializeComponent(); DataBindPrinters(); InitializeEvent(); }
Bu yazıya 0 yorum yapılmış.