using System;
using System.Drawing;
namespace FirebearScreenMaker
{
class Program
{
public static void Main(string[] args)
{
[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
[DllImport("user32.dll", EntryPoint="FindWindow", SetLastError = true)]
static extern IntPtr FindWindowByCaption(IntPtr ZeroOnly, string lpWindowName);
Image img = WindowImageCapture.CaptureWindow(FindWindow("Командная строка", false));
img.Save("screen.gif", System.Drawing.Imaging.ImageFormat.Gif);
}
public static int FindWindow(string windowName, bool wait)
{
int hWnd = FindWindow(windowName, null);
while (wait && hWnd == 0)
{
System.Threading.Thread.Sleep(500);
hWnd = FindWindow(windowName, null);
}
return hWnd;
}
public static bool BringWindowToTop(string windowName, bool wait)
{
int hWnd = FindWindow(windowName, wait);
if (hWnd != 0)
{
return SetForegroundWindow((IntPtr)hWnd);
}
return false;
}
}
public class WindowImageCapture
{
/// <summary>
/// Получение снимка окна
/// </summary>
/// <param name="WindowHandle">HWND окна</param>
/// <returns>Скриншот</returns>
public static Image CaptureWindow(IntPtr WindowHandle)
{
if (WindowHandle != null)
{
User32.RECT windowRect = new User32.RECT();
User32.GetWindowRect(WindowHandle, ref windowRect);
int width = windowRect.right - windowRect.left + 1;
int height = windowRect.bottom - windowRect.top + 1;
User32.SetWindowPos(WindowHandle,
(System.IntPtr)User32.HWND_TOPMOST,
0, 0, 0, 0,
User32.SWP_NOMOVE |
User32.SWP_NOSIZE |
User32.SWP_FRAMECHANGED);
IntPtr hdcSrc = User32.GetWindowDC(WindowHandle);
IntPtr hdcDest = GDI32.CreateCompatibleDC(hdcSrc);
IntPtr hBitmap = GDI32.CreateCompatibleBitmap(hdcSrc,
width,
height);
IntPtr hOld = GDI32.SelectObject(hdcDest, hBitmap);
GDI32.BitBlt(hdcDest, 0, 0,
width, height,
hdcSrc, 0, 0,
GDI32.SRCCOPY);
User32.SetWindowPos(WindowHandle,
(System.IntPtr)User32.HWND_NOTOPMOST,
0, 0, 0, 0,
User32.SWP_NOMOVE |
User32.SWP_NOSIZE |
User32.SWP_FRAMECHANGED);
GDI32.SelectObject(hdcDest, hOld);
GDI32.DeleteDC(hdcDest);
User32.ReleaseDC(WindowHandle, hdcSrc);
Image img = Image.FromHbitmap(hBitmap);
GDI32.DeleteObject(hBitmap);
return img;
}
else
return null;
}
private class User32
{
public const int SWP_FRAMECHANGED = 0x0020;
public const int SWP_NOMOVE = 0x0002;
public const int SWP_NOSIZE = 0x0001;
public const int SWP_NOZORDER = 0x0004;
public const int HWND_TOPMOST = -1;
public const int HWND_NOTOPMOST = -2;
[StructLayout(LayoutKind.Sequential)]
public struct RECT
{
public int left;
public int top;
public int right;
public int bottom;
}
[DllImport("user32.dll")]
public static extern IntPtr GetWindowDC(IntPtr hWnd);
[DllImport("user32.dll")]
public static extern IntPtr ReleaseDC(IntPtr hWnd, IntPtr hDC);
[DllImport("user32.dll")]
public static extern IntPtr GetWindowRect(IntPtr hWnd,
ref RECT rect);
[DllImport("user32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool SetWindowPos(IntPtr hWnd,
IntPtr hWndInsertAfter,
int x, int y,
int cx, int cy,
uint uFlags);
}
private class GDI32
{
public const int SRCCOPY = 0x00CC0020;
[DllImport("gdi32.dll")]
public static extern bool BitBlt(IntPtr hObject,
int nXDest, int nYDest,
int nWidth, int nHeight, IntPtr hObjectSource,
int nXSrc, int nYSrc, int dwRop);
[DllImport("gdi32.dll")]
public static extern IntPtr CreateCompatibleBitmap(IntPtr hDC,
int nWidth,
int nHeight);
[DllImport("gdi32.dll")]
public static extern IntPtr CreateCompatibleDC(IntPtr hDC);
[DllImport("gdi32.dll")]
public static extern bool DeleteDC(IntPtr hDC);
[DllImport("gdi32.dll")]
public static extern bool DeleteObject(IntPtr hObject);
[DllImport("gdi32.dll")]
public static extern IntPtr SelectObject(IntPtr hDC,
IntPtr hObject);
}
}
}
Форум → Программирование → Пыхнуть хотите? → Готовые решения → Firebear - делаем скриншоты к тексту
Firebear - делаем скриншоты к тексту
Страницы: ← Предыдущая страница • Следующая страница →
-
Фев. 28, 2011, 7:20 п.п., спустя 21 минуту 40 секунд
что-то нахуячил, ничего ни компилируетсяСпустя 123 сек.а всё понял, дллимпорт не туда вставил -
Фев. 28, 2011, 7:33 п.п., спустя 12 минут 55 секунд
Аргумент "1": преобразование типа из "int" в "System.IntPtr" невозможно (CS1503)
бля -
Фев. 28, 2011, 7:50 п.п., спустя 17 минут 3 секунды
вообщем вот этот код компилируется на ура, однако блять скриншот делать не хочетusing System;
using System.Drawing;
using System.Collections;
using System.Runtime.InteropServices;
namespace FirebearScreenMaker
{
class Program
{
public static void Main(string[] args)
{
Image img = WindowImageCapture.CaptureWindow(FindWindow("Командная строка", false));
img.Save("screen.gif", System.Drawing.Imaging.ImageFormat.Gif);
}
[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
[DllImport("user32.dll", EntryPoint="FindWindow", SetLastError = true)]
static extern IntPtr FindWindowByCaption(int ZeroOnly, string lpWindowName);
public static IntPtr FindWindow(string windowName, bool wait)
{
IntPtr hWnd = FindWindow(windowName, null);
while (wait && hWnd == System.IntPtr.Zero)
{
System.Threading.Thread.Sleep(500);
hWnd = FindWindow(windowName, null);
}
return hWnd;
}
}
public class WindowImageCapture
{
/// <summary>
/// Получение снимка окна
/// </summary>
/// <param name="WindowHandle">HWND окна</param>
/// <returns>Скриншот</returns>
public static Image CaptureWindow(IntPtr WindowHandle)
{
if (WindowHandle != null)
{
User32.RECT windowRect = new User32.RECT();
User32.GetWindowRect(WindowHandle, ref windowRect);
int width = windowRect.right - windowRect.left + 1;
int height = windowRect.bottom - windowRect.top + 1;
User32.SetWindowPos(WindowHandle,
(System.IntPtr)User32.HWND_TOPMOST,
0, 0, 0, 0,
User32.SWP_NOMOVE |
User32.SWP_NOSIZE |
User32.SWP_FRAMECHANGED);
IntPtr hdcSrc = User32.GetWindowDC(WindowHandle);
IntPtr hdcDest = GDI32.CreateCompatibleDC(hdcSrc);
IntPtr hBitmap = GDI32.CreateCompatibleBitmap(hdcSrc,
width,
height);
IntPtr hOld = GDI32.SelectObject(hdcDest, hBitmap);
GDI32.BitBlt(hdcDest, 0, 0,
width, height,
hdcSrc, 0, 0,
GDI32.SRCCOPY);
User32.SetWindowPos(WindowHandle,
(System.IntPtr)User32.HWND_NOTOPMOST,
0, 0, 0, 0,
User32.SWP_NOMOVE |
User32.SWP_NOSIZE |
User32.SWP_FRAMECHANGED);
GDI32.SelectObject(hdcDest, hOld);
GDI32.DeleteDC(hdcDest);
User32.ReleaseDC(WindowHandle, hdcSrc);
Image img = Image.FromHbitmap(hBitmap);
GDI32.DeleteObject(hBitmap);
return img;
}
else
return null;
}
private class User32
{
public const int SWP_FRAMECHANGED = 0x0020;
public const int SWP_NOMOVE = 0x0002;
public const int SWP_NOSIZE = 0x0001;
public const int SWP_NOZORDER = 0x0004;
public const int HWND_TOPMOST = -1;
public const int HWND_NOTOPMOST = -2;
[StructLayout(LayoutKind.Sequential)]
public struct RECT
{
public int left;
public int top;
public int right;
public int bottom;
}
[DllImport("user32.dll")]
public static extern IntPtr GetWindowDC(IntPtr hWnd);
[DllImport("user32.dll")]
public static extern IntPtr ReleaseDC(IntPtr hWnd, IntPtr hDC);
[DllImport("user32.dll")]
public static extern IntPtr GetWindowRect(IntPtr hWnd,
ref RECT rect);
[DllImport("user32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool SetWindowPos(IntPtr hWnd,
IntPtr hWndInsertAfter,
int x, int y,
int cx, int cy,
uint uFlags);
}
private class GDI32
{
public const int SRCCOPY = 0x00CC0020;
[DllImport("gdi32.dll")]
public static extern bool BitBlt(IntPtr hObject,
int nXDest, int nYDest,
int nWidth, int nHeight, IntPtr hObjectSource,
int nXSrc, int nYSrc, int dwRop);
[DllImport("gdi32.dll")]
public static extern IntPtr CreateCompatibleBitmap(IntPtr hDC,
int nWidth,
int nHeight);
[DllImport("gdi32.dll")]
public static extern IntPtr CreateCompatibleDC(IntPtr hDC);
[DllImport("gdi32.dll")]
public static extern bool DeleteDC(IntPtr hDC);
[DllImport("gdi32.dll")]
public static extern bool DeleteObject(IntPtr hObject);
[DllImport("gdi32.dll")]
public static extern IntPtr SelectObject(IntPtr hDC,
IntPtr hObject);
}
}
} -
Фев. 28, 2011, 7:52 п.п., спустя 1 минуту 53 секунды
ты прекрасно преподаешь прогарммирование методом "говнокодим по гуглю" (хотел написать пофеншую, но онатоле не одобрил какбэ)Сапожник без сапог -
Фев. 28, 2011, 7:59 п.п., спустя 7 минут 6 секунд
Всё заработало, отлично, отлично, сейчас сделаю аналог scrot а под венду -
Фев. 28, 2011, 8:02 п.п., спустя 3 минуты 11 секунд
А у нас есть bb-тег для сворачивания кода в рулон? -
Фев. 28, 2011, 8:07 п.п., спустя 5 минут 18 секунд
я делал, забраковали )You can be anything you want to be. Just turn yourself into anything you think that you could ever be. -
Фев. 28, 2011, 10:36 п.п., спустя 2 часа 28 минут 23 секунды
Написал рабочую утилиту для Windows, но для linux меня уже не хватит. Как оказалось там нету готовых решений. Scrot лишь кусок говна, вот что написано в мануале:Также можно сделать скриншот окна или выделенной области - для этого надо добавить в команду параметр "-s" и выбрать нужный объект мышкой.
Вопрос - какого хуя? Утилита то консольная, зачем мне куда то кликать мышкойСпустя 89 сек.Точнее это конечно полезная функция, но раз утилита консольная то должна быть возможность и прописать это окно, а не указывать его мышкой -
Фев. 28, 2011, 11:26 п.п., спустя 50 минут 6 секунд
у меня охуенная прога для скринов есть = )Спустя 11 сек.http://frozzeg.no-ip.info/KBAC3/screen_805826370_28.02.2011_23.26.01.jpgСпустя 45 сек.1 клик и скриншот, с уже скопированной на него ссылкой в буфере обмена, готовYou can be anything you want to be. Just turn yourself into anything you think that you could ever be. -
Март 7, 2011, 8:40 д.п., спустя 6 дней 9 часов 13 минут
у меня охуенная прога для скринов есть = )Спустя 11 сек.http://frozzeg.no-ip.info/KBAC3/screen_805826370_28.02.2011_23.26.01.jpgСпустя 45 сек.1 клик и скриншот, с уже скопированной на него ссылкой в буфере обмена, готов
Ну так поделись) А то я XnView юзаю, а там больше одного клика :) -
Март 19, 2011, 8:22 д.п., спустя 11 дней 23 часа 41 минуту
вот код основного класса версии 0.2.1
https://github.com/NonRealDeveloper/FireBear-Screen-PHP5-Library/blob/master/Firebear.php
сам проект находится тут
https://github.com/NonRealDeveloper/FireBear-Screen-PHP5-Library/
в отличии от предыдущей версии теперь класс умеет делать скриншоты окон, этим могут воспользоваться например создатели каких нибудь игр и тд, для автоматизации процессов вообщем
класс кроссплатформенный -
Март 19, 2011, 8:27 д.п., спустя 5 минут 37 секунд
варианты вызова$Screenshots->InitDaemon('taskmgr');
$Screenshots->PrintScreen('screen.png', 'Диспетчер задач Windows');$Screenshots->InitDaemon('taskmgr')->PrintScreen('screen.png', 'Диспетчер задач Windows');
InitDaemon вызывать не обязательно, это просто для примера чтобы было что сфоткать -
Март 19, 2011, 5:22 п.п., спустя 8 часов 55 минут 1 секунду
короче суть такова
гор. клавиша 1 делает скриншот всего экрана
вторая открывает окно, в котором ты выбираешь область экрана, которую хочешь засмкринишь и жмешь ентер
вот мои настройки, на выходе такая ссылка скриншота
http://frozzeg.no-ip.info/KBAC3/screen_547206836_19.03.2011_17.13.57.jpg
ничего удобнее своей проги не видел еще) правда как настраивать - не всем понятно, начал делать новую версию, еще пиздаче, но потом чето забил, надо таки доделать будетСпустя 137 сек.как вспомни времена принт скрина и пеинта - так страшно становиться )Спустя 34 сек.единственно что DirectX не скринитСпустя 273 сек.нет фреймворк 4 просит )You can be anything you want to be. Just turn yourself into anything you think that you could ever be. -
Март 19, 2011, 5:25 п.п., спустя 2 минуты 50 секунд
на что влияет опция "к данной директории имеется веб-доступ"? -
Март 19, 2011, 5:39 п.п., спустя 14 минут 2 секунды
на ссылку на скриншот, которая сохраняется в буфер обменаYou can be anything you want to be. Just turn yourself into anything you think that you could ever be.
Страницы: ← Предыдущая страница • Следующая страница →
Пожалуйста, авторизуйтесь, чтобы написать комментарий!