Форум программистов, компьютерный форум, киберфорум
Наши страницы
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.87/15: Рейтинг темы: голосов - 15, средняя оценка - 4.87
Vinemax
138 / 106 / 8
Регистрация: 12.09.2011
Сообщений: 687
1

Как сделать скрин формы?

16.09.2011, 21:35. Просмотров 2793. Ответов 12

Привет всем!

Подскажите, пожалуйста, возможно ли каким-то образом программно "снять" скриншот формы со всем её содержимым и поместить этот скрин в PictureBox? И еще... Есть ли у PictureBox какие-то функции управления цветами рисунка?

Спасибо!
0
Лучшие ответы (1)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.09.2011, 21:35
Ответы с готовыми решениями:

Как сделать скрин активного окна?
Как сделать скрин активного окна? скок искал находил только на общий скрин С Vb общаюсь недавно,...

Как сделать скриншот с формы, но что бы белый цвет отображался как прозрачный
Как сделать скриншот с формы, но что бы белый цвет отображался как прозрачный? Кто может помочь?

Как получить скрин чистого экрана
С помощью имитации нажатия клавиш(и) можно нажать принтскрин(альт принскрин), или воспользоваться...

Как сделать градиентную заливку формы
Доброго. Старики, которые помнят vb6, наверняка знали такую штуку Dim lY As Long Dim...

Как сделать заголовок формы невидимым?
Как сделать заголовок формы невидимым?

12
Ciberst
517 / 428 / 21
Регистрация: 16.12.2010
Сообщений: 953
Завершенные тесты: 1
16.09.2011, 21:49 2
да, конечно, сейчас код напишу
1
Памирыч
Почетный модератор
21108 / 8836 / 1080
Регистрация: 11.04.2010
Сообщений: 11,012
16.09.2011, 21:49 3
Цитата Сообщение от Vinemax Посмотреть сообщение
возможно ли каким-то образом программно "снять" скриншот формы со всем её содержимым и поместить этот скрин в PictureBox?
Да:
vb.net
1
2
3
4
        Dim BM As New Bitmap(Me.Bounds.Width, Me.Bounds.Height)
        Dim G As Graphics = Graphics.FromImage(BM)
        G.CopyFromScreen(Me.Bounds.X, Me.Bounds.Y, 0, 0, Me.Bounds.Size, CopyPixelOperation.SourceCopy)
        PictureBox1.BackgroundImage = BM
Цитата Сообщение от Vinemax Посмотреть сообщение
Есть ли у PictureBox какие-то функции управления цветами рисунка?
Нет
3
Ciberst
517 / 428 / 21
Регистрация: 16.12.2010
Сообщений: 953
Завершенные тесты: 1
16.09.2011, 22:13 4
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

vb.net
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
Public Class Form1
#Region "API"
    <System.Runtime.InteropServices.DllImport("User32.dll", SetLastError:=True)> _
Private Shared Function PrintWindow(ByVal hwnd As IntPtr, ByVal hDC As IntPtr, ByVal nFlags As UInteger) As Boolean
    End Function
    <System.Runtime.InteropServices.DllImport("user32.dll")> _
 Private Shared Function GetWindowRect(ByVal hWnd As IntPtr, ByRef lpRect As RECT) As Boolean
    End Function
    Public Structure RECT
        Public Left As Integer     '  // x position of upper-left corner
        Public Top As Integer     ' // y position of upper-left corner
        Public Right As Integer   ' // x position of lower-right corner
        Public Bottom As Integer '   // y position of lower-right corner
    End Structure
    Private Function GetPlacement(ByVal ind As IntPtr)
        Dim rect As New RECT
        GetWindowRect(ind, rect)
        Return rect
    End Function
#End Region
 
    Private Function fotka(ByVal id As IntPtr) As Bitmap
        Dim place As RECT = GetPlacement(id)
        If place.Left > -30000 Then
            Dim s As Size = Screen.PrimaryScreen.Bounds.Size
            Dim point As System.Drawing.Rectangle = New System.Drawing.Rectangle(0, 0, place.Right - place.Left, place.Bottom - place.Top)
            Dim g As Graphics = Me.CreateGraphics()
            Dim bmp As New Bitmap(point.Width - point.X, point.Height - point.Y, g)
            Dim memoryGraphics As Graphics = Graphics.FromImage(bmp)
            Dim dc As IntPtr = memoryGraphics.GetHdc()
            If PrintWindow(id, dc, 0) = True Then
                memoryGraphics.ReleaseHdc(dc)
                Return bmp
            Else
                Return Nothing
            End If
        Else
            Return Nothing
        End If
    End Function
 
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        PictureBox1.Image = fotka(Me.Handle)
    End Sub
End Class
Добавлено через 3 минуты
комментарий к моему коду: можно сделать снимок любой, формы, любого окна,
PictureBox1.Image = fotka(hwnd)
hwnd может принимать значения Form1.Handle, Form2.Handle или просто число соответствующее хендлу окна, например, 564165

Добавлено через 14 минут

Не по теме:

Памирыч, твой код у меня как-то коряво работает, не всю часть формы что-ли фоткает

2
16.09.2011, 22:13
Vinemax
138 / 106 / 8
Регистрация: 12.09.2011
Сообщений: 687
17.09.2011, 04:17  [ТС] 5
Благодарю, Ciberst! Спасибо, Памирыч! Оба кода отлично работают. Управление цветами нашел в Bitmap, отчего получился прямо-таки бомбейский выход из моей программы с плавным "чёрно-беливанием" (через Timer) задней формы, как в Windows... Посмотрите, если интересно:

http://narod.ru/disk/25371816001/Furniture_account.zip.html

...это локальная база данных под Framework 2.0. Вирусов и вредоносных модулей в этой проге нет - я фигнeй не занимаюсь
0
Памирыч
Почетный модератор
21108 / 8836 / 1080
Регистрация: 11.04.2010
Сообщений: 11,012
17.09.2011, 04:28 6
Vinemax, а твоя программа имеет какое-то отношение к теме?
0
Treals
29 / 29 / 3
Регистрация: 25.05.2011
Сообщений: 308
17.09.2011, 13:10 7
Симпотично написанно
1
Vinemax
138 / 106 / 8
Регистрация: 12.09.2011
Сообщений: 687
17.09.2011, 15:30  [ТС] 8
Кстати, если кому интересно, привожу код того, что у меня получилось с "чёрно-беливанием" основной формы (весь код в пределах одной формочки):

рисуем дочернюю формочку (какая-то основная у вас уже должны быть - любая), ставим на эту формочку три Button: Button1 - "Сменить пользователя", Button2 - "Выход" и Button3 - "Отмена". Также ставим Timer с именем Timer1, у которого Enabled = False, а Interval = 10. В коде этой формочки (у меня она называется frmВыход) прописываем:

vb.net
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
Public Class frmВыход
    '
    'ВСТАВИТЬ ЭТОТ КОД В ПРОЦЕДУРУ FormClosing ОСНОВНОЙ ФОРМЫ ПРОГРАММЫ:
    '
    'With frmВыход
    '    If Not .Выход Then .Показать()
    '    e.Cancel = Not .Выход
    'End With
    '
 
    Public MainForm As Form = frmMain 'основная форма программы
 
    Public Выход As Boolean = False
 
    Dim F As Form
 
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Выход = False : Me.Hide() : Me.Close()
 
        'вызов процедуры смены пользователя
        frmЗаказы.СменитьПользователяToolStripMenuItem_Click(Nothing, Nothing)
    End Sub
 
    Private Sub frmВыход_FormClosed(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
        If Not F Is Nothing Then
            If F.Created Then
                F.Close() : F.Dispose()
            End If
        End If
    End Sub
 
    Private Sub frmВыход_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
        'активация основной формы во избежание мерцания
        With MainForm
            If .Created Then
                .Select() : .Activate()
            End If
        End With
    End Sub
 
    Private Sub frmВыход_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Button3.Select()
    End Sub
 
    Private Sub frmВыход_VisibleChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.VisibleChanged
        If Not F Is Nothing Then
            If F.Created Then
                F.Visible = Me.Visible
            End If
        End If
    End Sub
 
    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Выход = True : frmMain.Close()
    End Sub
 
    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
        Выход = False : Me.Close()
    End Sub
 
    Public Sub Показать()
        Dim Img As Bitmap
 
        With MainForm.Bounds
            Img = New Bitmap(.Width, .Height)
            Graphics.FromImage(Img).CopyFromScreen(.X, .Y, 0, 0, .Size, CopyPixelOperation.SourceCopy)
        End With
 
 
        Dim c As Color, Gray As Byte
 
        With Img
            For x As Integer = 0 To .Width - 1
                For y As Integer = 0 To .Height - 1
                    c = .GetPixel(x, y)
 
                    Gray = 0.3 * c.R + 0.59 * c.G + 0.11 * c.B
 
                    c = Color.FromArgb(Gray, Gray, Gray)
                    .SetPixel(x, y, c)
                Next
            Next
        End With
 
 
        F = New Form
 
        AddHandler F.Activated, AddressOf F_Activate
 
        With F
            .StartPosition = FormStartPosition.Manual
            .Bounds = MainForm.Bounds
            .FormBorderStyle = Windows.Forms.FormBorderStyle.None
            .ShowInTaskbar = False
 
            .BackgroundImage = Img
 
            .Opacity = 0
            .ShowDialog(MainForm)
        End With
    End Sub
 
    Private Sub F_Activate(ByVal sender As System.Object, ByVal e As System.EventArgs)
        Timer1.Enabled = True
        Me.ShowDialog()
    End Sub
 
    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        With F
            .Opacity = .Opacity + 0.01
            Application.DoEvents()
 
            If .Opacity = 1 Then Timer1.Enabled = False
        End With
    End Sub
End Class
...получается при выполнении процедуры frmВыход_FormClosing выпадет эта формочка, как модальное окно, а эта самая форма, которая вызвала эту формочку (основная форма) плавно станет черно-белой. Естественно, что скорость перехода в черно-белое регулируется переменной Interval Timer'a на формочке.
1
Vinemax
138 / 106 / 8
Регистрация: 12.09.2011
Сообщений: 687
19.09.2011, 09:55  [ТС] 9
Цитата Сообщение от Памирыч Посмотреть сообщение
Vinemax, а твоя программа имеет какое-то отношение к теме?
Сама программа, конечно, не имеет к моей теме отношения, просто в качестве красивого выхода из этой программы я применил код, который ты мне передал, Памирыч, отчего и хотел показать что получилось.
0
Emser
3 / 3 / 0
Регистрация: 25.06.2006
Сообщений: 76
31.12.2017, 06:52 10
Для Памирыча:
у меня Касперский на этот код обзывается трояном и удаляет файл, создаваемый при отладке.
vb.net
1
2
3
4
Dim BM As New Bitmap(Me.Bounds.Width, Me.Bounds.Height)
Dim G As Graphics = Graphics.FromImage(BM)
G.CopyFromScreen(Me.Bounds.X, Me.Bounds.Y, 0, 0, Me.Bounds.Size, CopyPixelOperation.SourceCopy)
PictureBox1.BackgroundImage = BM
А при первом запуске отладки вообще устроил "Лечение с перезагрузкой".
Что там такого в этом коде, что этот, вобщем то хороший антивирус, так себя ведёт?
1
Дядя Корней
390 / 309 / 53
Регистрация: 14.08.2014
Сообщений: 1,010
31.12.2017, 11:44 11
Emser, CopyFromScreen ему видимо достаточно, чтобы начать "вонять".
Ну, а как ты хотел?
Мало ли не скриншоты делаются, а пароли фотографируются

Если серьезно, то это ложное срабатывание https://support.kaspersky.ru/viruses/general/1870
Пишите в поддержку, может соизволят и внесут сигнатуру в исключения.
1
_Radik_
66 / 60 / 11
Регистрация: 18.01.2014
Сообщений: 300
31.12.2017, 14:05 12
Emser, Хороший антивирус у юзера в голове должен быть, а все остальные т.н. програмные решения - это всегда компромисс между раздолбайством и паранойей , помноженное на всякие глюки программы.
1
Emser
3 / 3 / 0
Регистрация: 25.06.2006
Сообщений: 76
01.01.2018, 08:58 13
_Radik_, Вот я просто! спросил - какая часть кода касперу не нравится...
0
01.01.2018, 08:58
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.01.2018, 08:58

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

Как сделать закругленные края у формы?
собствено, помогите по сабжу.... как ни пытался не смог :(

Как сделать только часть формы прозрачной, а не всю?
Нужно сделать одну половину формы полупрозрачной, а вторую нормальной. Если это невозможно, то...


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

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

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