۳۱-فروردین-۱۳۸۸, ۰۱:۳۶:۲۳
۳۱-فروردین-۱۳۸۸, ۰۹:۴۲:۴۵
خب یه فایل تکست کنار برنامه ات بساز و توش عدد 0 رو ذخیره کن.
هر موقع روی دکمه پرینت کلیک شد، عددی که داخل فایل تکست هست رو بخون و اون رو با 1 جمع کن و دوباره توی فایل ذخیره کن.
این جوری متوجه می شی که چند بار پرینت شده.
همین کار رو می تونی توی Registry هم انجام بدی.
اگه واست مهمه که کسی به عدد دسترسی نداشته باشه می تونی اون رو تو خود فایل EXE ذخیره کنی
از DB هم می شه کمک گرفت
هر موقع روی دکمه پرینت کلیک شد، عددی که داخل فایل تکست هست رو بخون و اون رو با 1 جمع کن و دوباره توی فایل ذخیره کن.
این جوری متوجه می شی که چند بار پرینت شده.
همین کار رو می تونی توی Registry هم انجام بدی.
اگه واست مهمه که کسی به عدد دسترسی نداشته باشه می تونی اون رو تو خود فایل EXE ذخیره کنی
از DB هم می شه کمک گرفت
۳۱-فروردین-۱۳۸۸, ۱۶:۵۴:۴۱
نقل قول: اگه واست مهمه که کسی به عدد دسترسی نداشته باشه می تونی اون رو تو خود فایل EXE ذخیره کنی
يكم بيشتر توضيح ميدي لطفا؟
۰۱-اردیبهشت-۱۳۸۸, ۱۱:۴۸:۴۸
(۳۱-فروردین-۱۳۸۸, ۱۶:۵۴:۴۱)sav68 نوشته است: [ -> ]يكم بيشتر توضيح ميدي لطفا؟
شما می تونی یه برنامه داشته باشی و بهش بگی برو از بایت شماره 8000 توی خودت، یه کاراکتر رو بخون.
این کاراکتر می تونه همون عددی باشه که باید تعداد پرینت ها رو ثبت کنه. این عدد رو خود فایل، می تونه تغییر بده.
یعنی برنامه رو بایت 8000 ام خودش، تعداد دفعات پرینت رو ثبت می کنه.
اگه برنامه های تروجان رو دیده باشی، 2 تا فایل دارن. یه دونه Server، یه دونه Edit_Server
Server فایلی هست که باید برای قربانی بفرستی. مثلاً قراره وقتی فایل اجرا می شه یه پیغام ظاهر بشه. شما می خوای متن پیغام رو هر چی خواستی بذاری. پس توی برنامه Server می نویسی:
وقتی اجرا شدی، برو از بایت 67889 ام، بخون، یه عبارتی اونجا نوشته، اون رو توی Msgbox نمایش بده.
حالا می تونی با برنامه Edit_Server، بایت 67889 ام برنامه Server رو تغییر بدی و به تبعش، متن پیغام عوض می شه.
این هم یه نمونه مال خود ایرانویج: http://www.iranvig.com/3629.html
۰۴-اردیبهشت-۱۳۸۸, ۰۰:۳۹:۱۵
(۳۱-فروردین-۱۳۸۸, ۰۹:۴۲:۴۵)far_222000 نوشته است: [ -> ]خب یه فایل تکست کنار برنامه ات بساز و توش عدد 0 رو ذخیره کن.
هر موقع روی دکمه پرینت کلیک شد، عددی که داخل فایل تکست هست رو بخون و اون رو با 1 جمع کن و دوباره توی فایل ذخیره کن.
این جوری متوجه می شی که چند بار پرینت شده.
همین کار رو می تونی توی Registry هم انجام بدی.
اگه واست مهمه که کسی به عدد دسترسی نداشته باشه می تونی اون رو تو خود فایل EXE ذخیره کنی
از DB هم می شه کمک گرفت
این کار رو میشه در بانک هم انجام داد . مشکل من اینکه چطور تشخیص بدم که دکمه پرینت در قسمت گزارش گیری فشرده شده ! همون دکمه که بطور پیش فرض توی قسمت گزارش دیتا ریپورت اون بالا میاد
۰۴-اردیبهشت-۱۳۸۸, ۲۳:۳۳:۰۲
یه برنامه با دیتاریپورت بذار، ببینم کجا رو می گی
۱۰-اردیبهشت-۱۳۸۸, ۰۵:۴۶:۱۶
(۰۴-اردیبهشت-۱۳۸۸, ۲۳:۳۳:۰۲)far_222000 نوشته است: [ -> ]یه برنامه با دیتاریپورت بذار، ببینم کجا رو می گی
شما برو اینجا و فایل رو دانلود کن لینک دانلود وسط صفحه هست قرمز .
در برنامه وقتی دکمه print رو کلیک کنی گزارش باز میشه . که تازه در اون صفحه گزارش شما می تونی از گزارش با کلیک کردن دکمه بالای صفحه سمت چپ پرینت بگیری .
http://www.a1vbcode.com/app-3663.asp
ضمنا این رو هم اضافه کنم . در یک فروم خارجی سوال رو مطرح کردم . این لینک رو بهم دادند .
اما اصلا نمی دونم چطوری کار می کنه !
http://www.merrioncomputing.com/Programm...rinter.htm
۱۰-اردیبهشت-۱۳۸۸, ۱۱:۳۷:۴۲
این هم اون برنامه ای که می خواین!
وقتی برنامه رو اجرا می کنین با استفاده از API ها، تعداد پرینت هایی که همون موقع به پرینتر ارسال شدن رو بهتون نمایش می ده. البته می دونم که احتمال خطا هم وجود داره و مثلاً اگه نرم افزار دیگه ای هم پرینت فرستاده باشه، عددش با عددی که شما دنبالیش جمع می شه.
ویژوال بیسیک رو باز کنین، وارد بخش کد نویسی بشین. هر کدی که اونجا نوشته رو پاک کنین. این ها رو اونجا بنویسین. حالا برنامه رو اجرا کنین.
وقتی برنامه رو اجرا می کنین با استفاده از API ها، تعداد پرینت هایی که همون موقع به پرینتر ارسال شدن رو بهتون نمایش می ده. البته می دونم که احتمال خطا هم وجود داره و مثلاً اگه نرم افزار دیگه ای هم پرینت فرستاده باشه، عددش با عددی که شما دنبالیش جمع می شه.
کد:
Private Declare Function OpenPrinter Lib "winspool.drv" Alias "OpenPrinterA" (ByVal pPrinterName As String, phPrinter As Long, pDefault As Any) As Long
Private Declare Function ClosePrinter Lib "winspool.drv" (ByVal hPrinter As Long) As Long
Private Declare Function EnumJobs Lib "winspool.drv" Alias "EnumJobsA" (ByVal hPrinter As Long, ByVal FirstJob As Long, ByVal NoJobs As Long, ByVal Level As Long, pJob As Any, ByVal cdBuf As Long, pcbNeeded As Long, pcReturned As Long) As Long
Private Sub Form_Load()
'KPD-Team 2001
'URL: http://www.allapi.net/
'E-Mail: KPDTeam@Allapi.net
Dim hPrinter As Long, lNeeded As Long, lReturned As Long
Dim lJobCount As Long
OpenPrinter Printer.DeviceName, hPrinter, ByVal 0&
EnumJobs hPrinter, 0, 99, 1, ByVal 0&, 0, lNeeded, lReturned
If lNeeded > 0 Then
ReDim byteJobsBuffer(lNeeded - 1) As Byte
EnumJobs hPrinter, 0, 99, 1, byteJobsBuffer(0), lNeeded, lNeeded, lReturned
If lReturned > 0 Then
lJobCount = lReturned
Else
lJobCount = 0
End If
Else
lJobCount = 0
End If
ClosePrinter hPrinter
MsgBox "Jobs in printer queue: " + CStr(lJobCount), vbInformation
End Sub
۱۱-اردیبهشت-۱۳۸۸, ۲۰:۲۹:۳۳
(۱۰-اردیبهشت-۱۳۸۸, ۱۱:۳۷:۴۲)far_222000 نوشته است: [ -> ]این هم اون برنامه ای که می خواین!
وقتی برنامه رو اجرا می کنین با استفاده از API ها، تعداد پرینت هایی که همون موقع به پرینتر ارسال شدن رو بهتون نمایش می ده. البته می دونم که احتمال خطا هم وجود داره و مثلاً اگه نرم افزار دیگه ای هم پرینت فرستاده باشه، عددش با عددی که شما دنبالیش جمع می شه.
ویژوال بیسیک رو باز کنین، وارد بخش کد نویسی بشین. هر کدی که اونجا نوشته رو پاک کنین. این ها رو اونجا بنویسین. حالا برنامه رو اجرا کنین.کد:Private Declare Function OpenPrinter Lib "winspool.drv" Alias "OpenPrinterA" (ByVal pPrinterName As String, phPrinter As Long, pDefault As Any) As Long
Private Declare Function ClosePrinter Lib "winspool.drv" (ByVal hPrinter As Long) As Long
Private Declare Function EnumJobs Lib "winspool.drv" Alias "EnumJobsA" (ByVal hPrinter As Long, ByVal FirstJob As Long, ByVal NoJobs As Long, ByVal Level As Long, pJob As Any, ByVal cdBuf As Long, pcbNeeded As Long, pcReturned As Long) As Long
Private Sub Form_Load()
'KPD-Team 2001
'URL: http://www.allapi.net/
'E-Mail: KPDTeam@Allapi.net
Dim hPrinter As Long, lNeeded As Long, lReturned As Long
Dim lJobCount As Long
OpenPrinter Printer.DeviceName, hPrinter, ByVal 0&
EnumJobs hPrinter, 0, 99, 1, ByVal 0&, 0, lNeeded, lReturned
If lNeeded > 0 Then
ReDim byteJobsBuffer(lNeeded - 1) As Byte
EnumJobs hPrinter, 0, 99, 1, byteJobsBuffer(0), lNeeded, lNeeded, lReturned
If lReturned > 0 Then
lJobCount = lReturned
Else
lJobCount = 0
End If
Else
lJobCount = 0
End If
ClosePrinter hPrinter
MsgBox "Jobs in printer queue: " + CStr(lJobCount), vbInformation
End Sub
این کد رو تست کردم وقتی که می زنم چاپ با چاپگر اصلا چیزی رو تشخیص نمی ده و فقط 0 رو نشون میده . البته این رو هم بگم که در حالتی که با پرینتر مجازی چاپ میگیرم درست نشون میده اما وقتی که میزنم روی پرینتر نصب شده و حقیقی 0 نشون میده .
شما اگر می تونی رو اون برنامه که دادم این رو پیاده سازی کنی برام ممنوت میشم .
http://www.a1vbcode.com/app-3663.asp
۱۲-اردیبهشت-۱۳۸۸, ۱۱:۳۱:۳۴
بالاخره یافتم!!!!! خودم کلی ذوق کردم! :d
خود دیتاریپورت یه Event داره به نام DataReport_AsyncProgress
این Event یه آرگومان داره به نام JobType
JobType می تونه سه مقدار رو به ما بده: rptAsyncPrint، rptAsyncExport، rptAsyncPreview
خوب پس با این حساب کد زیر به ما می گه که کی روی دکمه Print کلیک شده و کی روی دکمه Export
فقط یادت نره این Event ماله دیتاریپورت هستش یه وقت توی فرم،Paste نکنی!!!(باید روی DataReport کلیک کنی تا به محیط کد نویسی وارد بشی، بعد اونجا این کد رو Paste کنی)
خود دیتاریپورت یه Event داره به نام DataReport_AsyncProgress
این Event یه آرگومان داره به نام JobType
JobType می تونه سه مقدار رو به ما بده: rptAsyncPrint، rptAsyncExport، rptAsyncPreview
خوب پس با این حساب کد زیر به ما می گه که کی روی دکمه Print کلیک شده و کی روی دکمه Export
کد:
Private Sub DataReport_AsyncProgress(ByVal JobType As MSDataReportLib.AsyncTypeConstants, ByVal Cookie As Long, ByVal PageCompleted As Long, ByVal TotalPages As Long)
Select Case JobType
Case rptAsyncPrint
MsgBox "Print"
Case rptAsyncExport
MsgBox "Export"
End Select
End Sub
۱۴-اردیبهشت-۱۳۸۸, ۰۰:۵۵:۳۹
(۱۲-اردیبهشت-۱۳۸۸, ۱۱:۳۱:۳۴)far_222000 نوشته است: [ -> ]بالاخره یافتم!!!!! خودم کلی ذوق کردم! :d
خود دیتاریپورت یه Event داره به نام DataReport_AsyncProgress
این Event یه آرگومان داره به نام JobType
JobType می تونه سه مقدار رو به ما بده: rptAsyncPrint، rptAsyncExport، rptAsyncPreview
خوب پس با این حساب کد زیر به ما می گه که کی روی دکمه Print کلیک شده و کی روی دکمه Export
فقط یادت نره این Event ماله دیتاریپورت هستش یه وقت توی فرم،Paste نکنی!!!(باید روی DataReport کلیک کنی تا به محیط کد نویسی وارد بشی، بعد اونجا این کد رو Paste کنی)کد:Private Sub DataReport_AsyncProgress(ByVal JobType As MSDataReportLib.AsyncTypeConstants, ByVal Cookie As Long, ByVal PageCompleted As Long, ByVal TotalPages As Long)
Select Case JobType
Case rptAsyncPrint
MsgBox "Print"
Case rptAsyncExport
MsgBox "Export"
End Select
End Sub
مرسی واقعا ، خیلی لطف کردی .
حالا یه مشکل دیگه که اگر حل بشه خیلی خوب میشه .
در پنجره print setup میشه تعیین کرد که از صفحه چند بار کپی (پرینت گرفته بشه ) . چطور میشه تعداد کپی ( پرینتی) که از گزارش گرفته میشه رو تشخیص داد؟ کسی راهی بلده ؟