كيف يمكنني العثور على موقف / موقع نافذة نظرا hWnd دون NativeMethods?

StackOverflow https://stackoverflow.com/questions/1434524

سؤال

أنا أعمل حاليا مع WatiN ، وإيجاد أن تكون كبيرة التصفح على شبكة الإنترنت أداة التشغيل الآلي.ومع ذلك ، من الإصدار الأخير ، فمن شاشة اسر وظائف يبدو أن تكون غير موجودة.لقد حان حتى مع حل عملي من أجل التقاط لقطات من الشاشة (بشكل مستقل توليد التعليمات البرمجية مشابهة هذا السؤال ستاكوفيرفلوو) بالإضافة إلى بعض الرمز من قبل تشارلز بيتزولد.للأسف, هناك مكون مفقود: أين الفعلية النافذة?

WatiN مريح يوفر المتصفح hWnd لك حتى نتمكن (مع هذا المثال المبسط) الحصول على مجموعة نسخ صورة من الشاشة مثل:

// browser is either an WatiN.Core.IE or a WatiN.Core.FireFox...
IntPtr hWnd = browser.hWnd;
string filename = "my_file.bmp";
using (Graphics browser = Graphics.FromHwnd(browser.hWnd) )
using (Bitmap screenshot = new Bitmap((int)browser.VisibleClipBounds.Width,
                                      (int)browser.VisibleClipBounds.Height,
                                      browser))
using (Graphics screenGraphics = Graphics.FromImage(screenshot))
{
    int hWndX = 0; // Upper left of graphics?  Nope, 
    int hWndY = 0; // this is upper left of the entire desktop!

    screenGraphics.CopyFromScreen(hWndX, hWndY, 0, 0, 
                          new Size((int)browser.VisibileClipBounds.Width,
                                   (int)browser.VisibileClipBounds.Height));
    screenshot.Save(filename, ImageFormat.Bmp);
}

النجاح!ونحن الحصول على لقطات, ولكن هناك مشكلة: hWndX و hWndY تشير دائما إلى الجانب الأيسر العلوي الأكثر زاوية الشاشة ، موقع نافذة نريد نسخ من.

ثم نظرت إلى Control.FromHandle, ومع ذلك يبدو أن هذا فقط العمل مع النماذج التي تم إنشاؤها;هذا الأسلوب بإرجاع مؤشر فارغة إذا كنت تمر hWnd في ذلك.

ثم مزيد من القراءة يؤدي بي إلى التبديل بلدي معايير البحث...كنت قد تم البحث عن موقع من النافذة عند معظم الناس تريد حقا أن 'موقف' من النافذة.هذا يؤدي إلى آخر لذلك السؤال التي تحدثت عن هذا ، ولكن جوابهم كان استخدام أساليب الأصلي.

لذلك ، هل هناك مواطن C# طريقة ايجاد موقف النافذة فقط نظرا hWnd (ويفضل مع فقط .NET 2.0 عصر المكتبات)?

هل كانت مفيدة؟

المحلول

أنا فقط ذهبت من خلال هذا المشروع و كان غير قادر على العثور على أي مدارة C# الطريقة.

إضافة إلى ريد الجواب ف/استدعاء رمز:

 [DllImport("user32.dll", SetLastError = true)]
 [return: MarshalAs(UnmanagedType.Bool)]
 static extern bool GetWindowRect(IntPtr hWnd, ref RECT lpRect);
 [StructLayout(LayoutKind.Sequential)]
 private struct RECT
 {
     public int Left;
     public int Top;
     public int Right;
     public int Bottom;
  }

نسميها كما:

  RECT rct = new RECT();
  GetWindowRect(hWnd, ref rct);

نصائح أخرى

لا - إذا لم يخلق شكل ، عليك أن P/الاحتجاج GetWindowRect.أنا لا أعتقد أن هناك المدارة ما يعادلها.

الجواب هو كما الآخرين قد ذكرت, ربما "لا, لا يمكنك أن تأخذ لقطة عشوائية نافذة من hwnd دون أساليب الأصلي.".بعض المحاذير قبل أن تظهر ذلك:

إنذار مسبق:

لمن يريد استخدام هذا الرمز ، علما بأن حجم معين من VisibleClipBounds فقط داخل النافذة و لا لا تشمل الحدود أو شريط العنوان.إنه drawable المنطقة.إذا كان لديك أن كنت قد تكون قادرة على القيام بذلك دون p/الاحتجاج.

(إذا كنت يمكن حساب الحدود من نافذة المتصفح ، يمكن استخدام VisibleClipBounds.إذا أردت يمكنك استخدام SystemInformation كائن إلى الحصول على معلومات مهمة مثل Border3DSize, أو يمكنك محاولة حساب ذلك عن طريق إنشاء شكل دمية ، اشتقاق الحدود شريط العنوان الارتفاع من ذلك, ولكن كل هذا يبدو مثل السحر الأسود أن الخلل مصنوعة من.)

هذا هو ما يعادل Ctrl+Printscreen من النافذة.هذا أيضا لا جماليات أن WatiN لقطة القدرة ، مثل التمرير المتصفح و تأخذ صورة من صفحة كاملة.هذا هو مناسبة ، ولكن قد لا يكون لك.

التحسينات:

هذا يمكن أن يكون تغيير امتداد الأسلوب إذا كنت في .صافي 3 و الأرض و خيار نوع الصورة يمكن أن تضاف بسهولة جدا (أنا الافتراضي ImageFormat.Bmp على سبيل المثال).

كود:

using System.Drawing;
using System.Drawing.Imaging;
using System.Runtime.InteropServices;

public class Screenshot
{
    class NativeMethods
    {
        // http://msdn.microsoft.com/en-us/library/ms633519(VS.85).aspx
        [DllImport("user32.dll", SetLastError = true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        public static extern bool GetWindowRect(IntPtr hWnd, ref RECT lpRect);

        // http://msdn.microsoft.com/en-us/library/a5ch4fda(VS.80).aspx
        [StructLayout(LayoutKind.Sequential)]
        public struct RECT
        {
            public int Left;
            public int Top;
            public int Right;
            public int Bottom;
        }
    }
    /// <summary>
    /// Takes a screenshot of the browser.
    /// </summary>
    /// <param name="b">The browser object.</param>
    /// <param name="filename">The path to store the file.</param>
    /// <returns></returns>
    public static bool SaveScreenshot(Browser b, string filename)
    {
        bool success = false;
        IntPtr hWnd = b.hWnd;
        NativeMethods.RECT rect = new NativeMethods.RECT();
        if (NativeMethods.GetWindowRect(hWnd, ref rect))
        {
            Size size = new Size(rect.Right - rect.Left,
                                 rect.Bottom - rect.Top);
            // Get information about the screen
            using (Graphics browserGraphics = Graphics.FromHwnd(hWnd))
            // apply that info to a bitmap...
            using (Bitmap screenshot = new Bitmap(size.Width, size.Height, 
                                                  browserGraphics))
            // and create an Graphics to manipulate that bitmap.
            using (Graphics imageGraphics = Graphics.FromImage(screenshot))
            {
                int hWndX = rect.Left;
                int hWndY = rect.Top;
                imageGraphics.CopyFromScreen(hWndX, hWndY, 0, 0, size);
                screenshot.Save(filename, ImageFormat.Bmp);
                success = true;
            }
        }
        // otherwise, fails.
        return success;
    }   
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top