الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

أود معلومات عن كيفية أخذ صورة للشاشة

مغلق
بدأه mr_pro_2020 في 11 مايو 2007 · 3 رد · 1,865 مشاهدة · في Microsoft Visual C#.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

تحية طيبة و بعد

كنت أود عمل برنامج مثل برنامج Snag it!

و هو من أشهر برامج إتقاط صورة للشاشة أو لجزء منها

فأين يمكنني أن أقرأ لأصل إلى هذا الموضوع ؟؟ََ!!

و لكم جزيل الشكر

أخوكم

Mr.Pro

ملحوظة : نصحني أحدهم بالقراءة في ال Buffer Managment

#2

السلام عليكم

شكرا جزيلا أخي على هذا السؤال الرائع

اقتباس
ملحوظة : نصحني أحدهم بالقراءة في ال Buffer Managment

لا تجهد نفسك فأنت في منتدى الفريق العربي للبرمجة (h)

تفاصيل الكود

هذه الدول الأصلية التي ستحتاجها

[DllImport("gdi32.dll")]
  public static extern bool BitBlt(IntPtr hdcDst, int xDst, int yDst, int cx, int cy, IntPtr hdcSrc, int xSrc, int ySrc, uint ulRop);
[DllImport("gdi32.dll")]
  public static extern bool StretchBlt(IntPtr hdcDst, int xDst, int yDst, int cx, int cy, IntPtr hdcSrc, int xSrc, int ySrc, int cxSrc, int cySrc, uint ulRop);
[DllImport("gdi32.dll")]
  public static extern IntPtr CreateDC(IntPtr lpszDriver, string lpszDevice, IntPtr lpszOutput, IntPtr lpInitData);
[DllImport("gdi32.dll")]
  public static extern IntPtr DeleteDC(IntPtr hdc);

BitBlt توفر هذه الدالة من نقل مجموعة من بت من المعطيات حول اللون من سياق الى سياق آخر.

StretchBlt تقوم هذه الدالة بنقل محتوى صورة من مجال الى مجال آخر

CreateDC تقوم هذه الدالة بإنشاء سياق الجهاز بالإعتماد على إسمه

DeleteDC تقوم هذه الدالة بإلغاء سياق لجهاز معين

هذان المتغيران أحدهما لحجز مجال لتضع فيه المعطيات التي إلتقطتها و الآخر لخزن جميع النوافذ المفتوحة

Rectangle CScreen = Rectangle.Empty;
 Screen[] screens = Screen.AllScreens;

حجز مستطيل الرسم على أنه مجموع باقي الشاشات المتواجدة

 foreach (Screen screen in screens)
 CScreen = Rectangle.Union(CScreen, screen.Bounds);

جمع كافة خصائص الرسم اللازمة للمجال الذي حجزناه في أول الكود

  Graphics g = Graphics.FromImage(finalBitmap);
  g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighSpeed;
  g.FillRectangle(SystemBrushes.Desktop, 0, 0, CScreen.Width - CScreen.X, CScreen.Height - CScreen.Y);

نقل محتوى خلفية الشاشة إلى المتغير الذي عرفناه وحددنا خصائصه

if (!StretchBlt(hdcDestination, screen.Bounds.X - CScreen.X, screen.Bounds.Y - CScreen.Y, screen.Bounds.Width, screen.Bounds.Height, hdcSource, 0, 0, screen.Bounds.Width, screen.Bounds.Height, (int)0x00CC0020))
				{
					System.ComponentModel.Win32Exception win32Exception = new System.ComponentModel.Win32Exception();
					System.Diagnostics.Trace.WriteLine(win32Exception);
				}

يبقى الآن تفريغ الموارد التي تم حجزها

 DeleteDC(hdcSource);
 g.ReleaseHdc(hdcDestination);
 g.Dispose();

هنا ينتهي الكود الرئيسي.

نبدأ الآن في كود جمالية البرنامج

إستعملت صورتان Pictureboxفي هذا البرنامج واحدة لإظهار الصورة الملتقطة والثانية تعوض زر

 private void pictureBox2_Click(object sender, EventArgs e)
  {
   this.WindowState = FormWindowState.Minimized;
   string path = "C:\\" + DateTime.Today.Date.ToString("f") + ".jpg";
   pictureBox1.Image = Capture();
   this.WindowState = FormWindowState.Normal;
   Bitmap image = new Bitmap(pictureBox1.Image);
   image.Save(path);
   MessageBox.Show(string.Format("Your image was saved in {0}", path), "Saved Image");
  }

عند أمر الإلتقاط نافذة البرنامج تختفي ثم تعود لكي لا يتم إلتقاطها أيضا يلي ذلك يتم حفظ الصورة في المجلد الرئيسي لحاسوبك مع تاريخ إلتقاطها.

ما الحل إذا كبر المستعمل نافذة البرنامج لرؤية الصورة كاملة؟؟؟

هناك أرقام معينة تحدد حال النافذة: تم تكبيرها, عادية, أو إنزالها

protected override void WndProc(ref Message m)
 {
  if (m.Msg == 0x0112)
	if (((int)m.WParam & 0xFFF0) == 0xF030) 
	 { BeginInvoke(new EventHandler(Form_Maximized), this, EventArgs.Empty); 
	 }			
	 base.WndProc(ref m);
 }

الإختبار الأول يخص ما إذا كان هناك حدث يخص حجم النافذة والثاني يخص حالة معينة وهي التكبير علما أن للتغيره الى إختبار حدث تصغير النافذة عوض 0xF030ب 0xF020

ونلاحظ هنا أنه تم إستدعاء دالة أخرى وهي وفيهاForm_Maximized يتم كتابة الحدث الذي نريد تشغيله

private void Form_Maximized(object sender, EventArgs e)
 {   pictureBox2.Visible = false;
	 pictureBox1.Size = this.Size;
 }

وقمت داخل الدالة بتكبير حجم الصورة وإخفاء الزر

اقتباس
كنت أود عمل برنامج مثل برنامج Snag it!

الآن صار بإمكانك ذلك ولله الحمد

post-91400-1178893067_thumb.jpg

ScreenCapure.zip

#3

بارك الله فيك موضوع ملفت للنظر

#4

أشكرك بشدة أخي العزيز

Ben_Laiid

وجزاكم الله خيرا

و أعتذر عن عدم سرعة الرد لإنشغالي في الإمتحانات

هذا الموضوع مغلق.

مواضيع مشابهة