PDA

View Full Version : سوال: کار با پرینتر



hamid_73
چهارشنبه 06 فروردین 1393, 08:02 صبح
سلام دوستان من می خوام یه پروژه بسازم که بتونه تعداد صفحاتی که پرینت شده رو بفهمه و کنترل کنه که از یه تعدادی بیشتر نشه و نمی خوام که مجبور باشم همه تنظیمات پرینتر رو به برنامم اضافه کنم (مثل تعیین نوع صفحه و ....)
برا همین می خوام کاربر هر فایلی رو که خواست با کنترل پراکسس ران کنه و پرینت بگیره
من میخوام برنامم در بک گراند کار کنه و مدام صف پرینتر رو چک کنه و تعداد صفحاتی که پرینت میشه رو به دست بیاره و به کاربر نمایش بده
منظورم این نیست که مثلا بگه صفحه 1 از 10 منظورم اینه که صب کنه تا پرینت صفحات تموم بشه بعد بگه که چند تا صفحه پرینت بشه.
پروژه اصلی من برای یه دانشگاهه که می خوان دانشجو ها بتونن یه تعداد صفحه رو به صورت رایگان چاپ کنند و بعد از اون پولی چاپ کنن من تمامه کاراش رو کردم فقط مشکلم شمردن تعداد صفحات پرینتره من خیلی از راه ها رو امتحان کردم هیچ کدومشون به دردم نخورد شما دوستان اگه راه حله بهتری دارین که مجبور نباشم صفحات پرینت شده رو بشمارم خیلی ممنون میشم که راهنمایی کنین مرسی:قلب:
یکی از راهایی که با دوسته خوبم sohil_ww (http://barnamenevis.org/member.php?274781-sohil_ww) رفتم و فکر کنم شاید بشه یه کاری روش انجام داد، این روشه زیره ولی به خاطر حلقه بی نهایتی که مدام باید بره صف رو چک کنه مشکله بزرگی شده برام
این لینکه کلاسش
لینک (http://dl.esfandune.ir/images/4yw5skptu9n7j2boecp9.rar)
این کد رو تو کنترل بکگراندورکر نوشتم.
دوستان خواهش می کنم کمک کنین این پروژه خیلی برام مهمه


int text = 0;
while (true)
{
Print obj = new Print();
if (obj.NUMBEROFPAGE > 0)
{
text = obj.NUMBEROFPAGE;
MessageBox.Show(text.ToString());
ConnectionString();
OpenConnection();
using (cmd = new SqlCommand("INSERT INTO tbl_Rep(ID, Countt, Date) VALUES (@ID, @Countt, @Date)", conn))
{
cmd.Connection = conn;
cmd.Parameters.AddWithValue("@ID", lbl_ID.Text);
cmd.Parameters.AddWithValue("@Countt", text.ToString());
cmd.Parameters.AddWithValue("@Date", Class.Public_Class.Date_Shamsi());
cmd.ExecuteNonQuery();
conn.Close();
MessageBox.Show("ذخیره شد");
}

Thread.Sleep(5000);
}

hamid_73
چهارشنبه 13 فروردین 1393, 16:48 عصر
یعنی هیچکی هیچ نظری نداره ؟؟:متفکر:

hamid_73
پنج شنبه 14 فروردین 1393, 11:10 صبح
دوستان خواهش می کنم کمک کنین خیلی نیاز دارم :گریه:

khokhan
پنج شنبه 14 فروردین 1393, 12:51 عصر
دوستان خواهش می کنم کمک کنین خیلی نیاز دارم :گریه:
ابتدا System.Management رو به رفرنسها تون اضافه کنین
بعد همزمان با ارسال سند به چاپ می تونین یه کوئری داخل کلاس wmi ویندوز بزنین و با یه حلقه هربار که صفحه ای زیر چاپ میره نام پرینتر و نام سند و شماره برگ مورد چاپ رو توی لیبل های جداگانه نمایش بدین
با داشتن این کوئری و دانستن شماره صفحه می تونین شرطهای متعدد اجرا کنین
و یا اینکه شرط بگذارین که در صورتی که تعداد برگ به فلان عدد رسیدپروسه قطع بشه و تعداد معین از تعداد کل چاپ کم و به مبلغ محاسبه بشه :لبخند:
حتی می تونین این کوئری رو در یه ترد دیگه اجرا کنین
این هم کوئری :

System.Management.ObjectQuery oq = new System.Management.ObjectQuery("SELECT * FROM Win32_PrintJob");
ManagementObjectSearcher query1 = new ManagementObjectSearcher(oq);
ManagementObjectCollection queryCollection1 = query1.Get();

foreach (ManagementObject mo in queryCollection1)
{
label1.Text = (("نام پرینتر : " + mo["DriverName"].ToString()));
label2.Text = (("نام سند مورد چاپ : " + mo["Document"].ToString()));
label3.Text = (("سند چاپ شده تا این لحظه : " + mo["PagesPrinted"].ToString()));


}

117567

این کلاس دو تا متد هم داره به نامهای Pause (http://msdn.microsoft.com/en-us/library/aa392736%28v=vs.85%29.aspx) برای متوقف ساختن چاپ و دیگری Resume (http://msdn.microsoft.com/en-us/library/aa393238%28v=vs.85%29.aspx) جهت شروع مجدد

khokhan
پنج شنبه 14 فروردین 1393, 13:18 عصر
دوستان خواهش می کنم کمک کنین خیلی نیاز دارم :گریه:
واین هم لیست تمام اطلاعاتی که می توانید از طریق کلاس Win32_PrintJob و از طریق کوئری بدست بیارین
طریقه استخراجش رو هم در پست بالا گفتم :لبخند:




pPrinterName



pMachineName



pUserName



pDocument



pNotifyName



pDatatype



pPrintProcessor



pParameters



pDriverName



pDevMode



pStatus



pSecurityDescriptor



Status



Priority



Position



StartTime



UntilTime



TotalPages



Size



Submitted



Time



PagesPrinted

hamid_73
پنج شنبه 14 فروردین 1393, 15:36 عصر
داداش یک دنیا ممنون :قلب:
سورسشم میزارین

systam
پنج شنبه 14 فروردین 1393, 18:52 عصر
سلام
استاد khokhan این برنامه برای سیستم های شبکه میتوان استفاده کرد
برای مسیر صف چاپ روی سرور چطوری باید آدرس دهی کرد
این کد درسته"Win32_PrintJob.Name=""Value"""

منبعش اینه (http://include.wutils.com/wmi/ROOT%5Ccimv2/CIM_ManagedSystemElement/CIM_LogicalElement/CIM_Job/Win32_PrintJob.html)

hamid_73
چهارشنبه 27 فروردین 1393, 21:07 عصر
ابتدا System.Management رو به رفرنسها تون اضافه کنین
بعد همزمان با ارسال سند به چاپ می تونین یه کوئری داخل کلاس wmi ویندوز بزنین و با یه حلقه هربار که صفحه ای زیر چاپ میره نام پرینتر و نام سند و شماره برگ مورد چاپ رو توی لیبل های جداگانه نمایش بدین
با داشتن این کوئری و دانستن شماره صفحه می تونین شرطهای متعدد اجرا کنین
و یا اینکه شرط بگذارین که در صورتی که تعداد برگ به فلان عدد رسیدپروسه قطع بشه و تعداد معین از تعداد کل چاپ کم و به مبلغ محاسبه بشه :لبخند:
حتی می تونین این کوئری رو در یه ترد دیگه اجرا کنین
این هم کوئری :

System.Management.ObjectQuery oq = new System.Management.ObjectQuery("SELECT * FROM Win32_PrintJob");
ManagementObjectSearcher query1 = new ManagementObjectSearcher(oq);
ManagementObjectCollection queryCollection1 = query1.Get();

foreach (ManagementObject mo in queryCollection1)
{
label1.Text = (("نام پرینتر : " + mo["DriverName"].ToString()));
label2.Text = (("نام سند مورد چاپ : " + mo["Document"].ToString()));
label3.Text = (("سند چاپ شده تا این لحظه : " + mo["PagesPrinted"].ToString()));


}

117567

این کلاس دو تا متد هم داره به نامهای Pause (http://msdn.microsoft.com/en-us/library/aa392736%28v=vs.85%29.aspx) برای متوقف ساختن چاپ و دیگری Resume (http://msdn.microsoft.com/en-us/library/aa393238%28v=vs.85%29.aspx) جهت شروع مجدد

داداش این pages printed که کار نمیکنه خواهش می کنم کمک کنین

systam
یک شنبه 15 تیر 1393, 22:43 عصر
سلام
استاد khokhan برس به دادم چرا تعداد پرینت های ارسالی درست نمایش نمیده همه رو صفر میزنه
میخوام با هر باری که پررینت ارسال میشه به صف چاپ تعداد صفحه ریخته میشه در لیست باکس
ممنون میشم راهنماییم کنی
یا علی