8 / 8 / 2
Регистрация: 16.03.2011
Сообщений: 257
1

Как получить изображение окна другого приложения?

01.03.2015, 17:52. Показов 4202. Ответов 10
Метки нет (Все метки)

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

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
IntPtr hDC, hSrcDC;
                Rectangle rcSrc;
                GetWindowRect(hWnd, out rcSrc);
                hDC = GetDC(hWnd);
                hSrcDC = CreateCompatibleDC((IntPtr)null);
 
                Bitmap bmp = new Bitmap("c:\\fakePhoto.jpg");
                System.Drawing.Imaging.BitmapData bmpData = bmp.LockBits(rcSrc, ImageLockMode.ReadOnly, bmp.PixelFormat);
                Bitmap newBitmap = new Bitmap(rcSrc.Right - rcSrc.Left, rcSrc.Bottom - rcSrc.Top, bmpData.Stride, bmp.PixelFormat, hDC);
                bmp.UnlockBits(bmpData);
 
                SelectObject(hSrcDC, newBitmap.GetHbitmap());
                PrintWindow(hWnd, hSrcDC, 0);
                BitBlt(
                    hDC,
                    0,
                    0,
                    rcSrc.Right - rcSrc.Left,
                    rcSrc.Bottom - rcSrc.Top,
                    hSrcDC,
                    0,
                    0,
                    TernaryRasterOperations.SRCCOPY);
                pictureBox1.Image = newBitmap;
Пишу на C# используя библиотеки win api
программа не идет дальше строки
C#
1
Bitmap bmp = new Bitmap("c:\\fakePhoto.jpg");
Добавлено через 1 час 28 минут
Я пытаюсь вот этот метод написать на c# так, чтобы изображение в итоге было в Bitmap, но не выходит. Помогите плиз.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
bool screen_shot_game(HWND window_f)
{
  if(global_hunt!=NULL){
  RECT rcSrc;
  HWND hSrcWnd;
  HDC hDC, hSrcDC;
  HBITMAP hBmp;
 
  GetWindowRect(window_f, &rcSrc);
  hDC = GetDC(window_f);
  hSrcDC = CreateCompatibleDC(NULL);
  hBmp = CreateCompatibleBitmap(hDC, rcSrc.right - rcSrc.left,    rcSrc.bottom - rcSrc.top);
  SelectObject(hSrcDC, hBmp);
  PrintWindow(window_f, hSrcDC, 0);
  BitBlt(
   hDC,
   0,
   0,
   rcSrc.right - rcSrc.left,
   rcSrc.bottom - rcSrc.top,
   hSrcDC,
   0,
   0,
   SRCCOPY);
  StoreBitmapFile("3.bmp",hBmp);
  DeleteObject(hBmp);
  DeleteDC(hSrcDC);
  ReleaseDC(global_hunt, hDC);
  return true;
  }
   return false;
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
1
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.03.2015, 17:52
Ответы с готовыми решениями:

Как получить изображение свёрнутого окна?
Как получить изображение свёрнутого окна?

Получить координаты окна стороннего приложения
Здравствуйте дорогие форумчане, встал вопрос как получить координаты СТОРОННЕЙ программы , при...

Получить содержимое и/или элементы окна стороннего приложения
Подскажите, возможно ли с помощью C# (в том числе winapi) получить сабж?

Получить дескриптор окна стороннего приложения и контекстного меню
Здравствуйте. Подскажите пожалуйста. Как можно словить дескриптор выскакивающего окна? в списке...

10
Заблокирован
01.03.2015, 18:37 2
fenix117, не совсем понятно о чем речь. Вы хотите сделать скриншот стороннего приложения?
1
8 / 8 / 2
Регистрация: 16.03.2011
Сообщений: 257
01.03.2015, 19:13  [ТС] 3
Цитата Сообщение от Ev_Hyper Посмотреть сообщение
fenix117, не совсем понятно о чем речь. Вы хотите сделать скриншот стороннего приложения?
Да. Выше я нашел код на win api, но мне его надо переделать на c#. Он позволяет делать скрин даже если окно перекрыто другими окнами. На выходе мне нужен скриншот в Bitmap.

Добавлено через 1 минуту
Все библиотеки я подключаю:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
[DllImport("kernel32.dll")]
        public static extern IntPtr OpenProcess(int dwDesiredAccess, bool bInheritHandle, int dwProcessId);
 
        [DllImport("user32.dll", SetLastError = true)]
        static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
 
        [DllImport("user32.dll", SetLastError = true)]
        static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId);
        
        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        static extern bool SendMessage(IntPtr hWnd, int Msg, char wParam, int lParam);
 
        [DllImport("user32.dll", SetLastError = true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        static extern bool PrintWindow(IntPtr hwnd, IntPtr hDC, uint nFlags);
 
        [DllImport("gdi32.dll", EntryPoint = "CreateCompatibleDC", SetLastError = true)]
        static extern IntPtr CreateCompatibleDC([In] IntPtr hdc);
 
        public enum TernaryRasterOperations : uint
        {
            SRCCOPY = 0x00CC0020,
            SRCPAINT = 0x00EE0086,
            SRCAND = 0x008800C6,
            SRCINVERT = 0x00660046,
            SRCERASE = 0x00440328,
            NOTSRCCOPY = 0x00330008,
            NOTSRCERASE = 0x001100A6,
            MERGECOPY = 0x00C000CA,
            MERGEPAINT = 0x00BB0226,
            PATCOPY = 0x00F00021,
            PATPAINT = 0x00FB0A09,
            PATINVERT = 0x005A0049,
            DSTINVERT = 0x00550009,
            BLACKNESS = 0x00000042,
            WHITENESS = 0x00FF0062,
            CAPTUREBLT = 0x40000000
        }
 
        [DllImport("gdi32.dll", EntryPoint = "BitBlt", SetLastError = true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        static extern bool BitBlt([In] IntPtr hdc, int nXDest, int nYDest, int nWidth, int nHeight, [In] IntPtr hdcSrc, int nXSrc, int nYSrc, TernaryRasterOperations dwRop);
 
        [DllImport("user32.dll")]
        static extern IntPtr GetDC(IntPtr hwnd);
 
        [DllImport("user32.dll", SetLastError = true)]
        static extern bool GetWindowRect(IntPtr hwnd, out Rectangle lpRect);
 
        [DllImport("gdi32.dll", EntryPoint = "CreateCompatibleBitmap")]
        static extern IntPtr CreateCompatibleBitmap([In] IntPtr hdc, int nWidth, int nHeight);
 
        [System.Runtime.InteropServices.DllImport("gdi32.dll")]
        public static extern bool DeleteObject(IntPtr hObject);
 
        [DllImport("gdi32.dll", EntryPoint = "SelectObject")]
        public static extern IntPtr SelectObject([In] IntPtr hdc, [In] IntPtr hgdiobj);
2
Заблокирован
01.03.2015, 19:59 4
Цитата Сообщение от fenix117 Посмотреть сообщение
Он позволяет делать скрин даже если окно перекрыто другими окнами.
fenix117, можете поподробнее об этом рассказать?

У меня получилось сделать следующее:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
 #region import
        [return: MarshalAs(UnmanagedType.Bool)]
        [DllImport("user32.dll", SetLastError = true)]
        public static extern bool GetWindowRect(IntPtr hwnd, out RECT lpRect);
 
        [StructLayout(LayoutKind.Sequential)]
        public struct RECT
        {
            public int Left;        // x position of upper-left corner
            public int Top;         // y position of upper-left corner
            public int Right;       // x position of lower-right corner
            public int Bottom;      // y position of lower-right corner
 
            public override string ToString()
            {
                return string.Format("{0,4} {1,4} {2,4} {3,4}", Left, Top, Right, Bottom);
            }
        }
        
        [DllImport("user32.dll", SetLastError = true)]
        static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString, int nMaxCount);
 
        delegate bool EnumWindowsProc(IntPtr hWnd, IntPtr lParam);
 
        [DllImport("user32.dll", SetLastError = true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        static extern bool EnumWindows(EnumWindowsProc lpEnumFunc, IntPtr lParam);
 
        [DllImport("user32.dll", SetLastError = true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        static extern bool IsWindowVisible(IntPtr hWnd);
 
        [DllImport("user32.dll", SetLastError = true)]
        static extern int GetWindowTextLength(IntPtr hWnd);
        #endregion
 
        public Form1()
        {
            InitializeComponent();
            listBox1.MouseClick += listBox1_MouseClick;
            button2.Click += btnSearchHwnd_Click;
        }
        List<IntPtr> ListHandles = new List<IntPtr>();
        void listBox1_MouseClick(object sender, MouseEventArgs e)
        {
 
            IntPtr Handle = ListHandles[listBox1.SelectedIndex];
            RECT rct;
            if (!GetWindowRect(Handle, out rct))
            {
                MessageBox.Show("ERROR");
                return;
            }
            this.Hide();
            Size s = new System.Drawing.Size(rct.Right - rct.Left + 1, rct.Bottom - rct.Top + 1);
            Bitmap memoryImage = new Bitmap(s.Width, s.Height);
            using (var g = Graphics.FromImage(memoryImage))
                g.CopyFromScreen(rct.Left, rct.Top, 0, 0, s);
            memoryImage.Save("screen.bmp");
            memoryImage.Dispose();
            this.Show();
            MessageBox.Show("Файл сохранен");
        }
 
        private void btnSearchHwnd_Click(object sender, EventArgs e)
        {
            EnumWindows((hWnd, lParam) =>
            {
                if ((IsWindowVisible(hWnd) && GetWindowTextLength(hWnd) != 0))
                {
                    ListHandles.Add(hWnd);
                    listBox1.Items.Add(GetWindowText(hWnd));
                }
                return true;
            }, IntPtr.Zero);
        }
        string GetWindowText(IntPtr hWnd)
        {
            int len = GetWindowTextLength(hWnd) + 1;
            StringBuilder sb = new StringBuilder(len);
            len = GetWindowText(hWnd, sb, len);
            return sb.ToString(0, len);
        }
По клику на кнопку в листбокс добавляются названия окон. По клику на название делается скриншот области окна, но только верхнего участка. Как сделать скриншот с учетом перекрытия пока не понял - буду искать дальше.
1
8 / 8 / 2
Регистрация: 16.03.2011
Сообщений: 257
01.03.2015, 20:09  [ТС] 5
Цитата Сообщение от Ev_Hyper Посмотреть сообщение
можете поподробнее об этом рассказать?
Смотрел здесь: ссылка

PrintWindow - вот эта штука делает скрин окна по дескриптору окна
1
Заблокирован
01.03.2015, 20:37 6
Лучший ответ Сообщение было отмечено fenix117 как решение

Решение

fenix117, кажется получилось - у вас же рабочий код на С# в стартовом посту...Через пару минут выложу что получилось - уберу кучу лишнего кода из текущего проекта

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
        #region import
        [return: MarshalAs(UnmanagedType.Bool)]
        [DllImport("user32.dll", SetLastError = true)]
        public static extern bool GetWindowRect(IntPtr hwnd, out RECT lpRect);
 
        [StructLayout(LayoutKind.Sequential)]
        public struct RECT
        {
            public int Left;        // x position of upper-left corner
            public int Top;         // y position of upper-left corner
            public int Right;       // x position of lower-right corner
            public int Bottom;      // y position of lower-right corner
 
            public override string ToString()
            {
                return string.Format("{0,4} {1,4} {2,4} {3,4}", Left, Top, Right, Bottom);
            }
        }
 
        [DllImport("user32.dll", SetLastError = true)]
        static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString, int nMaxCount);
 
        delegate bool EnumWindowsProc(IntPtr hWnd, IntPtr lParam);
 
        [DllImport("user32.dll", SetLastError = true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        static extern bool EnumWindows(EnumWindowsProc lpEnumFunc, IntPtr lParam);
 
        [DllImport("user32.dll", SetLastError = true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        static extern bool IsWindowVisible(IntPtr hWnd);
 
        [DllImport("user32.dll", SetLastError = true)]
        static extern int GetWindowTextLength(IntPtr hWnd);
 
        [DllImport("user32.dll", SetLastError = true)]
        static extern IntPtr GetDC(IntPtr hWnd);
 
        /// <summary>
        ///    Performs a bit-block transfer of the color data corresponding to a
        ///    rectangle of pixels from the specified source device context into
        ///    a destination device context.
        /// </summary>
        /// <param name="hdc">Handle to the destination device context.</param>
        /// <param name="nXDest">The leftmost x-coordinate of the destination rectangle (in pixels).</param>
        /// <param name="nYDest">The topmost y-coordinate of the destination rectangle (in pixels).</param>
        /// <param name="nWidth">The width of the source and destination rectangles (in pixels).</param>
        /// <param name="nHeight">The height of the source and the destination rectangles (in pixels).</param>
        /// <param name="hdcSrc">Handle to the source device context.</param>
        /// <param name="nXSrc">The leftmost x-coordinate of the source rectangle (in pixels).</param>
        /// <param name="nYSrc">The topmost y-coordinate of the source rectangle (in pixels).</param>
        /// <param name="dwRop">A raster-operation code.</param>
        /// <returns>
        ///    <c>true</c> if the operation succeedes, <c>false</c> otherwise. To get extended error information, call <see cref="System.Runtime.InteropServices.Marshal.GetLastWin32Error"/>.
        /// </returns>
        [DllImport("gdi32.dll", EntryPoint = "BitBlt", SetLastError = true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        static extern bool BitBlt([In] IntPtr hdc, int nXDest, int nYDest, int nWidth, int nHeight, [In] IntPtr hdcSrc, int nXSrc, int nYSrc, TernaryRasterOperations dwRop);
 
        public enum TernaryRasterOperations : uint
        {
            SRCCOPY = 0x00CC0020,
            SRCPAINT = 0x00EE0086,
            SRCAND = 0x008800C6,
            SRCINVERT = 0x00660046,
            SRCERASE = 0x00440328,
            NOTSRCCOPY = 0x00330008,
            NOTSRCERASE = 0x001100A6,
            MERGECOPY = 0x00C000CA,
            MERGEPAINT = 0x00BB0226,
            PATCOPY = 0x00F00021,
            PATPAINT = 0x00FB0A09,
            PATINVERT = 0x005A0049,
            DSTINVERT = 0x00550009,
            BLACKNESS = 0x00000042,
            WHITENESS = 0x00FF0062,
            CAPTUREBLT = 0x40000000
        }
 
        [DllImport("user32.dll", SetLastError = true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        static extern bool PrintWindow(IntPtr hwnd, IntPtr hDC, uint nFlags);
        #endregion
        public Form1()
        {
            InitializeComponent();
            listBox1.MouseClick += listBox1_MouseClick;
            button1.Click += btnSearchHwnd_Click;
        }
 
        List<IntPtr> ListHandles = new List<IntPtr>();
        void listBox1_MouseClick(object sender, MouseEventArgs e)
        {
 
            IntPtr Handle = ListHandles[listBox1.SelectedIndex];
            RECT rct;
            if (!GetWindowRect(Handle, out rct))
            {
                MessageBox.Show("ERROR");
                return;
            }
            MessageBox.Show(rct.ToString());
 
            Size s = new System.Drawing.Size(rct.Right - rct.Left + 1, rct.Bottom - rct.Top + 1);
            Bitmap bmp = new Bitmap(s.Width, s.Height);
            Graphics g = System.Drawing.Graphics.FromImage(bmp);
            IntPtr dc1 = g.GetHdc();
            IntPtr dc2 = GetDC(Handle);
 
            bool success = PrintWindow(Handle, dc2, 0);
            if (!success)
            { MessageBox.Show("Неудача!"); return; }
 
            MessageBox.Show(string.Format("{0} {1}", s.Width, s.Height));
            BitBlt(dc1, 0, 0, s.Width, s.Height, dc2, 0, 0, TernaryRasterOperations.SRCCOPY);
            g.ReleaseHdc(dc1);
            bmp.Save("screen.bmp");
            bmp.Dispose();
            MessageBox.Show("Файл сохранен");
        }
 
        private void btnSearchHwnd_Click(object sender, EventArgs e)
        {
            EnumWindows((hWnd, lParam) =>
            {
                if ((IsWindowVisible(hWnd) && GetWindowTextLength(hWnd) != 0))
                {
                    ListHandles.Add(hWnd);
                    listBox1.Items.Add(GetWindowText(hWnd));
                }
                return true;
            }, IntPtr.Zero);
        }
        string GetWindowText(IntPtr hWnd)
        {
            int len = GetWindowTextLength(hWnd) + 1;
            StringBuilder sb = new StringBuilder(len);
            len = GetWindowText(hWnd, sb, len);
            return sb.ToString(0, len);
        }
Вложения
Тип файла: rar Screen.rar (147.3 Кб, 81 просмотров)
2
8 / 8 / 2
Регистрация: 16.03.2011
Сообщений: 257
01.03.2015, 23:00  [ТС] 7
Почему если выводить это изображение в picturebox, а не сохранять, получается черный экран?
0
Заблокирован
01.03.2015, 23:53 8
Цитата Сообщение от fenix117 Посмотреть сообщение
Почему если выводить это изображение в picturebox, а не сохранять, получается черный экран?
fenix117, покажите как выводите. У себя добавил picturBox, работает:
Как получить изображение окна другого приложения?
0
8 / 8 / 2
Регистрация: 16.03.2011
Сообщений: 257
02.03.2015, 00:28  [ТС] 9
Делаю скрин игры. Игра использует directx. В файл сохраняет нормально. А в picturebox:
Миниатюры
Как получить изображение окна другого приложения?  
0
Заблокирован
03.03.2015, 22:21 10
fenix117, я имею ввиду как выводите в pictureBox:
C#
1
picturBox1.Image = ...
Черный экран только с этим процессом или со всеми?
0
8 / 8 / 2
Регистрация: 16.03.2011
Сообщений: 257
04.03.2015, 21:45  [ТС] 11
Только с теми, кто использует directx (игры). Как мне его подключить, я в списке при добавлении ссылки в проект его не вижу.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.03.2015, 21:45

Перерисовка окна другого процесса через дескриптор этого окна
Приветствую всех. Может кто-то знает, как перерисовать окно другого процесса через дескриптор...

Как развернуть окно, из другого приложения
Добрый день. Разрабатываю приложение которое сворачивается в трей и далее работает в фоновом...

Как можно открыть изображение в новой вкладе окна
Есть страница с FileUpLoad, которая загружает изображение ( на компьютер, в папку которая не в...

Как запустить метод из другого окна?
Подскажите пожалуйста, смотрю примеры разные но не пойму как правильно сделать. Имеем окно...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.