Перейти к содержанию
СофтФорум - всё о компьютерах и не только

Снимаем скрины


Рекомендуемые сообщения

Доброго времени суток.

Есть код который копирует часть экрана

Bitmap bmp = new Bitmap(1024, 768);using (Graphics g = Graphics.FromImage(bmp)){g.CopyFromScreen(0, 0, 0, 0, new Size(1024, 768));}bmp.Save("E:\\1.bmp");

Можно ли копировать часть из нужного мне окна, а не с рабстола. То есть чтобы фокус и положение необходимого окна не имели значения???

В данный момент пользую C#, но готов рассмотреть альтернативы если есть такая возможность.

Ссылка на комментарий
Поделиться на другие сайты

Можно. Надо пользуват g.FromHwnd(), только вам нужно знать hWnd окна.

Ссылка на комментарий
Поделиться на другие сайты

Можно. Надо пользуват g.FromHwnd(), только вам нужно знать hWnd окна.

Можно пример как с помощью этого метода сохранить скрин с определеного окна в файл(Handle есть).

Изменено пользователем skilk
Ссылка на комментарий
Поделиться на другие сайты

hWnd activeWindow = ...;Bitmap bmp = new Bitmap(1024, 768);using (Graphics g = Graphics.FromImage(bmp)){g.FromHwnd(activeWindow));}bmp.Save("E:\\1.bmp");

MSDN

К стате, не пользувал, просто в MSDN проверил :)

Изменено пользователем Darhazer
Ссылка на комментарий
Поделиться на другие сайты

Получился такой код

IntPtr Handle = Win32API.FindWindow(null, "Калькулятор"); //Handle получает правильно           Bitmap bmp = new Bitmap(50, 50);using (Graphics g = Graphics.FromImage(bmp)){g.FromHwnd(Handle); //здесь ошибка}bmp.Save("D:\\1.bmp");

Пишет ошибку

Ошибка	1	Доступ к члену "System.Drawing.Graphics.FromHwnd(System.IntPtr)" через ссылку на экземпляр невозможен; вместо этого уточните его, указав имя типа	C:\Users\1\documents\visual studio 2010\Projects\***\***\Form1.cs	32	17	***
Изменено пользователем skilk
Ссылка на комментарий
Поделиться на другие сайты

Как я понял, вам надо добавить:

using System.Runtime.InteropServices;

А также:

[DllImport("user32.dll", EntryPoint = "FindWindow")]   private static extern IntPtr FindWindowA(string lpClassName,    string lpWindowName);

После етого можно пользувать FindWindow (без Win32API)

IntPtr Handle = FindWindow(null, "Калькулятор");if (Handle != IntPtr.Zero) {Bitmap bmp = new Bitmap(50, 50);using (Graphics g = Graphics.FromImage(bmp)){  g.FromHwnd(Handle);}bmp.Save("D:\\1.bmp");

К стате, рекомендують пользуват GetProcessesByName и MainWindowHandle

Process[] processes = Process.GetProcessesByName("notepad");foreach (Process p in processes){   IntPtr pFoundWindow = p.MainWindowHandle;   // Do something with the handle...   //}

Еще если не получаеться, попробуйте код без Bitmap-а :think:

Ссылка на комментарий
Поделиться на другие сайты

Как я понял, вам надо добавить:

using System.Runtime.InteropServices;

А также:

[DllImport("user32.dll", EntryPoint = "FindWindow")]   private static extern IntPtr FindWindowA(string lpClassName,    string lpWindowName);

После етого можно пользувать FindWindow (без Win32API)

IntPtr Handle = FindWindow(null, "Калькулятор");if (Handle != IntPtr.Zero) {Bitmap bmp = new Bitmap(50, 50);using (Graphics g = Graphics.FromImage(bmp)){  g.FromHwnd(Handle);}bmp.Save("D:\\1.bmp");

К стате, рекомендують пользуват GetProcessesByName и MainWindowHandle

Process[] processes = Process.GetProcessesByName("notepad");foreach (Process p in processes){   IntPtr pFoundWindow = p.MainWindowHandle;   // Do something with the handle...   //}

Еще если не получаеться, попробуйте код без Bitmap-а :think:

FindWindow у меня определено правильно (в другом модуле), ошибка возникает именно на строке

g.FromHwnd(Handle);

Битмап на ошибку не влияет.

Без WinAPI

Process[] processes = Process.GetProcessesByName("calc.exe");

таже ситуация.

Код целиком

using System;using System.Diagnostics;using System.Drawing;using System.Windows.Forms;using System.Runtime.InteropServices;namespace App{   public partial class Form1 : Form   {       public Form1()       {           InitializeComponent();       }       private void button1_Click(object sender, EventArgs e)       {                      Process[] processes = Process.GetProcessesByName("calc.exe");           foreach (Process p in processes)           {               IntPtr pFoundWindow = p.MainWindowHandle;               // Do something with the handle...               //               Bitmap bmp = new Bitmap(1024, 768);               using (Graphics g = Graphics.FromImage(bmp))               {                   g.FromHwnd(pFoundWindow );               }               //bmp.Save("D:\\1.bmp");           }                 }    }}
Изменено пользователем skilk
Ссылка на комментарий
Поделиться на другие сайты

Без Bitmap-ом имел ввиду:

               using (Graphics g = Graphics.FromHwnd(Handle))               {///               }

Только что заметил что FromHwnd - static. Нельзя пользуват g.FromHwnd, только Graphics.FromHwnd.

Наверника вам будуть нужни два Graphics обекта и скопировать из одного на другово. Но в .NET не знаю как. В Win32 API делають при помощю BitBlt.

Если найду пример, отправлю

Ссылка на комментарий
Поделиться на другие сайты

i

Уведомление:
Совершенно не обязательно цитировать полностью предыдущий пост...


Спасибо за помощь, сделал иначе.
using System;using System.Drawing;using System.Runtime.InteropServices;using System.Threading;using System.Windows.Forms;namespace App{   public partial class Form1 : Form   {       public Form1()       {           InitializeComponent();       }       public enum WindowShowStyle : uint       {           /// <summary>Hides the window and activates another window.</summary>           /// <remarks>See SW_HIDE</remarks>           Hide = 0,           /// <summary>Activates and displays a window. If the window is minimized           /// or maximized, the system restores it to its original size and           /// position. An application should specify this flag when displaying           /// the window for the first time.</summary>           /// <remarks>See SW_SHOWNORMAL</remarks>           ShowNormal = 1,           /// <summary>Activates the window and displays it as a minimized window.</summary>           /// <remarks>See SW_SHOWMINIMIZED</remarks>           ShowMinimized = 2,           /// <summary>Activates the window and displays it as a maximized window.</summary>           /// <remarks>See SW_SHOWMAXIMIZED</remarks>           ShowMaximized = 3,           /// <summary>Maximizes the specified window.</summary>           /// <remarks>See SW_MAXIMIZE</remarks>           Maximize = 3,           /// <summary>Displays a window in its most recent size and position.           /// This value is similar to "ShowNormal", except the window is not           /// actived.</summary>           /// <remarks>See SW_SHOWNOACTIVATE</remarks>           ShowNormalNoActivate = 4,           /// <summary>Activates the window and displays it in its current size           /// and position.</summary>           /// <remarks>See SW_SHOW</remarks>           Show = 5,           /// <summary>Minimizes the specified window and activates the next           /// top-level window in the Z order.</summary>           /// <remarks>See SW_MINIMIZE</remarks>           Minimize = 6,           /// <summary>Displays the window as a minimized window. This value is           /// similar to "ShowMinimized", except the window is not activated.</summary>           /// <remarks>See SW_SHOWMINNOACTIVE</remarks>           ShowMinNoActivate = 7,           /// <summary>Displays the window in its current size and position. This           /// value is similar to "Show", except the window is not activated.</summary>           /// <remarks>See SW_SHOWNA</remarks>           ShowNoActivate = 8,           /// <summary>Activates and displays the window. If the window is           /// minimized or maximized, the system restores it to its original size           /// and position. An application should specify this flag when restoring           /// a minimized window.</summary>           /// <remarks>See SW_RESTORE</remarks>           Restore = 9,           /// <summary>Sets the show state based on the SW_ value specified in the           /// STARTUPINFO structure passed to the CreateProcess function by the           /// program that started the application.</summary>           /// <remarks>See SW_SHOWDEFAULT</remarks>           ShowDefault = 10,           /// <summary>Windows 2000/XP: Minimizes a window, even if the thread           /// that owns the window is hung. This flag should only be used when           /// minimizing windows from a different thread.</summary>           /// <remarks>See SW_FORCEMINIMIZE</remarks>           ForceMinimized = 11       }       [DllImport("user32.dll")]       public static extern bool ShowWindow(IntPtr hWnd, WindowShowStyle nCmdShow);       [DllImport("user32.dll", SetLastError = true)]       public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);       [DllImport("user32.dll", SetLastError = true)]       internal static extern bool MoveWindow(IntPtr hWnd, int X, int Y, int nWidth, int nHeight, bool bRepaint);       [return: MarshalAs(UnmanagedType.Bool)]       [DllImport("user32.dll", SetLastError = true)]       private static extern bool GetWindowInfo(IntPtr hwnd, ref WINDOWINFO pwi);       [structLayout(LayoutKind.Sequential)]       public struct RECT       {           public int _Left;           public int _Top;           public int _Right;           public int _Bottom;       }       [structLayout(LayoutKind.Sequential)]       struct WINDOWINFO       {           public uint cbSize;           public RECT rcWindow;           public RECT rcClient;           public uint dwStyle;           public uint dwExStyle;           public uint dwWindowStatus;           public uint cxWindowBorders;           public uint cyWindowBorders;           public ushort atomWindowType;           public ushort wCreatorVersion;           public WINDOWINFO(Boolean? filler)               : this()   // Allows automatic initialization of "cbSize" with "new WINDOWINFO(null/true/false)".           {               cbSize = (UInt32)(Marshal.SizeOf(typeof(WINDOWINFO)));           }       }       private void button1_Click(object sender, EventArgs e)       {             		           IntPtr Handle = FindWindow("WindowClass", "WindowName");           textBox1.Text = Handle.ToString();           ShowWindow(Handle, WindowShowStyle.Hide);           Thread.Sleep(150);           MoveWindow(Handle, 0, 0, 0, 0, true);           Thread.Sleep(150);           ShowWindow(Handle, WindowShowStyle.ShowNormal);           Thread.Sleep(500);           WINDOWINFO info = new WINDOWINFO();           info.cbSize = (uint)Marshal.SizeOf(info);           GetWindowInfo(Handle, ref info);           int x, y, x1, y1;           x1 = info.rcClient._Left;           y1 = info.rcClient._Top;           x = info.rcWindow._Right - (x1 * 2);           y = info.rcWindow._Bottom - x1 - y1;           Bitmap bmp = new Bitmap(x, y);           using (Graphics g = Graphics.FromImage(bmp))           {               g.CopyFromScreen(x1, y1, 0, 0, new Size(x, y));           }           bmp.Save("D:\\5.bmp");       }      }}
Изменено пользователем Yezhishe
Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...