С наступающим Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Maxim Prishchepa
Эксперт С++
1925 / 1037 / 109
Регистрация: 29.03.2010
Сообщений: 3,167
1

Программа падает на Marshal.Copy при попытке сделать скриншот через WinAPI

26.07.2016, 12:52. Просмотров 222. Ответов 1

Доброго, требуется "грабить" экран, задача вроде тривиальная но все же есть косяки:
Одно из условий: нет возможности использовать System.Drawing
следовательно осталось только WinAPI и как результат следующий код:

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
class Some {
        [DllImport("user32.dll")]
        static extern int GetSystemMetrics(SystemMetric smIndex);
        
        public enum SystemMetric : int {...}
 
        [DllImport("gdi32.dll", EntryPoint = "CreateCompatibleDC", SetLastError = true)]
        static extern IntPtr CreateCompatibleDC([In] IntPtr hdc);
 
        [DllImport("gdi32.dll", EntryPoint = "CreateCompatibleBitmap")]
        static extern IntPtr CreateCompatibleBitmap([In] IntPtr hdc, int nWidth, int nHeight);
 
        [DllImport("gdi32.dll", EntryPoint = "SelectObject")]
        public static extern IntPtr SelectObject([In] IntPtr hdc, [In] IntPtr hgdiobj);
 
        enum TernaryRasterOperations : uint { ... }
 
        [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("gdi32.dll", EntryPoint = "DeleteDC")]
        public static extern bool DeleteDC([In] IntPtr hdc);
 
        [DllImport("user32.dll")]
        static extern bool ReleaseDC(IntPtr hWnd, IntPtr hDC);
 
        byte [] screen() {
            int screenHeight = GetSystemMetrics(SystemMetric.SM_CYVIRTUALSCREEN);
            int screenWidth = GetSystemMetrics(SystemMetric.SM_CXVIRTUALSCREEN);
 
            IntPtr hdc = GetDC(IntPtr.Zero);              // get a desktop dc
            IntPtr hDest = CreateCompatibleDC(hdc); // create a dc to use for capture
 
            IntPtr hbCapture = CreateCompatibleBitmap(hdc, screenWidth, screenHeight);
            SelectObject(hDest, hbCapture);
 
            // the following line effectively copies the screen into the capture bitamp
            BitBlt(hDest, 0, 0, screenWidth, screenHeight, hdc, 0, 0, TernaryRasterOperations.SRCCOPY);
 
            // clean up - release unused resources!
            ReleaseDC(IntPtr.Zero, hdc);
            DeleteDC(hDest);
            
            int size = screenWidth * screenHeight; // пробовал так же: screenWidth * screenHeight * 3 или: screenWidth * screenHeight + screenHeight; есть большие подозрения, что косячу именно тут, но как именно - хз
            byte[] managedArray = new byte[size];
            string error;
            try
            {
                Marshal.Copy(hbCapture, managedArray, 0, size); // crush
            }
            catch (Exception ex)
            {
                error = ex.Message;
            }
           
            return managedArray;
      }
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.07.2016, 12:52
Ответы с готовыми решениями:

Приложение падает при попытке соединения через сокет
IPEndPoint ipEndPoint = new IPEndPoint(ip, port); Socket...

Как избежать Marshal.Copy для отправки данных
У меня есть указатель IntPtr на масив байт и размер этого массива. Чтоб...

Получение указателя через Marshal.GetFunctionPointerForDelegate
Итак, есть код: public static class HookDrive { ///<summary> ...

Вываливается программа при попытке запустить таймер
Здравствуйте. Пишу свой класс, там у меня есть System.Windows.Forms.Timer, пишу...

Возникает ошибка при попытке авторизации в ВК через VkApi
Ребята есть некая задача. Нужно написать простенькую программу для работы с ВК....

1
DataPlanner
153 / 183 / 49
Регистрация: 25.11.2013
Сообщений: 978
27.07.2016, 00:17 2
https://msdn.microsoft.com/en-us/library/dd183402
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.07.2016, 00:17

DirectX.AudioVideoPlayback: при попытке запустить видео программа зависает
Подключил using Microsoft.DirectX; using...

Мусор при использовании класса Marshal
Здравствуйте, форумчане. Имеется тестовая функция на С++ которая возвращает...

Программа падает при попытке вывести диалог
Ест проект QT (простите за грязный код, если кто ни-будь чего-нибудь...


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

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

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