skilk Опубликовано 12 марта, 2011 Жалоба Поделиться Опубликовано 12 марта, 2011 Доброго времени суток. Есть код который копирует часть экрана 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#, но готов рассмотреть альтернативы если есть такая возможность. Ссылка на комментарий Поделиться на другие сайты Поделиться
Darhazer Опубликовано 12 марта, 2011 Жалоба Поделиться Опубликовано 12 марта, 2011 Можно. Надо пользуват g.FromHwnd(), только вам нужно знать hWnd окна. Ссылка на комментарий Поделиться на другие сайты Поделиться
skilk Опубликовано 12 марта, 2011 Автор Жалоба Поделиться Опубликовано 12 марта, 2011 (изменено) Можно. Надо пользуват g.FromHwnd(), только вам нужно знать hWnd окна. Можно пример как с помощью этого метода сохранить скрин с определеного окна в файл(Handle есть). Изменено 12 марта, 2011 пользователем skilk Ссылка на комментарий Поделиться на другие сайты Поделиться
Darhazer Опубликовано 12 марта, 2011 Жалоба Поделиться Опубликовано 12 марта, 2011 (изменено) hWnd activeWindow = ...;Bitmap bmp = new Bitmap(1024, 768);using (Graphics g = Graphics.FromImage(bmp)){g.FromHwnd(activeWindow));}bmp.Save("E:\\1.bmp"); MSDN К стате, не пользувал, просто в MSDN проверил :) Изменено 12 марта, 2011 пользователем Darhazer Ссылка на комментарий Поделиться на другие сайты Поделиться
skilk Опубликовано 13 марта, 2011 Автор Жалоба Поделиться Опубликовано 13 марта, 2011 (изменено) Получился такой код 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 *** Изменено 13 марта, 2011 пользователем skilk Ссылка на комментарий Поделиться на другие сайты Поделиться
Darhazer Опубликовано 13 марта, 2011 Жалоба Поделиться Опубликовано 13 марта, 2011 Как я понял, вам надо добавить: 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: Ссылка на комментарий Поделиться на другие сайты Поделиться
skilk Опубликовано 13 марта, 2011 Автор Жалоба Поделиться Опубликовано 13 марта, 2011 (изменено) Как я понял, вам надо добавить: 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"); } } }} Изменено 13 марта, 2011 пользователем skilk Ссылка на комментарий Поделиться на другие сайты Поделиться
Darhazer Опубликовано 13 марта, 2011 Жалоба Поделиться Опубликовано 13 марта, 2011 Без Bitmap-ом имел ввиду: using (Graphics g = Graphics.FromHwnd(Handle)) {/// } Только что заметил что FromHwnd - static. Нельзя пользуват g.FromHwnd, только Graphics.FromHwnd. Наверника вам будуть нужни два Graphics обекта и скопировать из одного на другово. Но в .NET не знаю как. В Win32 API делають при помощю BitBlt. Если найду пример, отправлю Ссылка на комментарий Поделиться на другие сайты Поделиться
skilk Опубликовано 13 марта, 2011 Автор Жалоба Поделиться Опубликовано 13 марта, 2011 (изменено) 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"); } }} Изменено 14 марта, 2011 пользователем Yezhishe Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Для публикации сообщений создайте учётную запись или авторизуйтесь
Вы должны быть пользователем, чтобы оставить комментарий
Создать учетную запись
Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!
Регистрация нового пользователяВойти
Уже есть аккаунт? Войти в систему.
Войти