ФорумПрограммированиеПыхнуть хотите?Готовые решения → Firebear - делаем скриншоты к тексту

Firebear - делаем скриншоты к тексту

  • fgets

    Сообщения: 1099 Репутация: N Группа: Кто попало

    Spritz 28 февраля 2011 г. 19:20, спустя 21 минуту 40 секунд

    что-то нахуячил, ничего ни компилируется

    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);
    }
    }
    }
    Спустя 123 сек.
    а всё понял, дллимпорт не туда вставил
  • fgets

    Сообщения: 1099 Репутация: N Группа: Кто попало

    Spritz 28 февраля 2011 г. 19:33, спустя 12 минут 55 секунд

    Аргумент "1": преобразование типа из "int" в "System.IntPtr" невозможно (CS1503)

    бля
  • fgets

    Сообщения: 1099 Репутация: N Группа: Кто попало

    Spritz 28 февраля 2011 г. 19: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);
    }
    }
    }
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 28 февраля 2011 г. 19:52, спустя 1 минуту 53 секунды

    ты прекрасно преподаешь прогарммирование методом "говнокодим по гуглю" (хотел написать пофеншую, но онатоле не одобрил какбэ)
    Сапожник без сапог
  • fgets

    Сообщения: 1099 Репутация: N Группа: Кто попало

    Spritz 28 февраля 2011 г. 19:59, спустя 7 минут 6 секунд

    Всё заработало, отлично, отлично, сейчас сделаю аналог scrot а под венду
  • Timur

    Сообщения: 1068 Репутация: N Группа: Джедаи

    Spritz 28 февраля 2011 г. 20:02, спустя 3 минуты 11 секунд

    А у нас есть bb-тег для сворачивания кода в рулон?
  • Frozzeg

    Сообщения: 5641 Репутация: N Группа: Джедаи

    Spritz 28 февраля 2011 г. 20:07, спустя 5 минут 18 секунд

    я делал, забраковали )
    You can be anything you want to be. Just turn yourself into anything you think that you could ever be.
  • fgets

    Сообщения: 1099 Репутация: N Группа: Кто попало

    Spritz 28 февраля 2011 г. 22:36, спустя 2 часа 28 минут 23 секунды

    Написал рабочую утилиту для Windows, но для linux меня уже не хватит. Как оказалось там нету готовых решений. Scrot лишь кусок говна, вот что написано в мануале:
    Также можно сделать скриншот окна или выделенной области - для этого надо добавить в команду параметр "-s" и выбрать нужный объект мышкой.

    Вопрос - какого хуя? Утилита то консольная, зачем мне куда то кликать мышкой
    Спустя 89 сек.
    Точнее это конечно полезная функция, но раз утилита консольная то должна быть возможность и прописать это окно, а не указывать его мышкой
  • Frozzeg

    Сообщения: 5641 Репутация: N Группа: Джедаи

    Spritz 28 февраля 2011 г. 23: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.
  • felix90

    Сообщения: 191 Репутация: N Группа: Адекваты

    Spritz 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 юзаю, а там больше одного клика :)
  • fgets

    Сообщения: 1099 Репутация: N Группа: Кто попало

    Spritz 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/

    в отличии от предыдущей версии теперь класс умеет делать скриншоты окон, этим могут воспользоваться например создатели каких нибудь игр и тд, для автоматизации процессов вообщем

    класс кроссплатформенный
  • fgets

    Сообщения: 1099 Репутация: N Группа: Кто попало

    Spritz 19 марта 2011 г. 8:27, спустя 5 минут 37 секунд

    варианты вызова
    $Screenshots->InitDaemon('taskmgr');
    $Screenshots->PrintScreen('screen.png', 'Диспетчер задач Windows');


    $Screenshots->InitDaemon('taskmgr')->PrintScreen('screen.png', 'Диспетчер задач Windows');


    InitDaemon вызывать не обязательно, это просто для примера чтобы было что сфоткать
  • Frozzeg

    Сообщения: 5641 Репутация: N Группа: Джедаи

    Spritz 19 марта 2011 г. 17: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.
  • krasun

    Сообщения: 1370 Репутация: N Группа: Джедаи

    Spritz 19 марта 2011 г. 17:25, спустя 2 минуты 50 секунд

    на что влияет опция "к данной директории имеется веб-доступ"?
  • Frozzeg

    Сообщения: 5641 Репутация: N Группа: Джедаи

    Spritz 19 марта 2011 г. 17:39, спустя 14 минут 2 секунды

    на ссылку на скриншот, которая сохраняется в буфер обмена
    You can be anything you want to be. Just turn yourself into anything you think that you could ever be.

Пожалуйста, авторизуйтесь, чтобы написать комментарий!