функция, получающая скриншот окна

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

AnarCky
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 229
Зарегистрирован: 20.11.2006 (Пн) 20:12
Откуда: Россия, Екатеринбург.

функция, получающая скриншот окна

Сообщение AnarCky » 13.10.2007 (Сб) 17:37

Пишу функцию которая делает скриншот окна. Делал сверяясь с книжкой, поэтому удмвлен почему возникла ошибка.
На строчке со звездочкой ошибка:
"System.Runtime.InteropServices.MarshalDirectiveException' occurred in UCIS ver 0.21.exe
Additional information: PInvoke restriction: can not return variants."

Код: Выделить всё

    Private Function GetScreenShot() As Bitmap
        Dim hWndDesktop As IntPtr
        hWndDesktop = GetDesktopWindow()

        Dim rct As RECT
        GetWindowRect(hWndDesktop, rct)
        Dim Width As Int32 = rct.Right - rct.Left
        Dim Height As Int32 = rct.Bottom - rct.Top

        Dim pt As New POINTAPI
        pt.y = rct.Top
        pt.x = rct.Left
        ScreenToClient(hWndDesktop, pt)          '*
        rct.Left = pt.x
        rct.Top = pt.y

        Dim b As New Bitmap(Width, Height)
        Dim g As Graphics = Graphics.FromImage(b)
        Dim hdcWindow As IntPtr = GetDC(hWndDesktop)

        Dim hdc As IntPtr = g.GetHdc()
        BitBlt(hdc.ToInt32, 0, 0, Width, Height, hdcWindow.ToInt32, rct.Left, rct.Top, SRCCOPY)

        ReleaseDC(hWndDesktop, hdcWindow)
        g.ReleaseHdc(hdc)

        Return b
    End Function


что это за ошибка вообще такая??? а с таким типом исключений я вообще не сталкивался.
и что конкретно не может "return variants" ("возвращать переменные" так ведь?), функция, или как?
Объясните пожалуйста, а то я в ступоре :shock:
Компьютеры были придуманы чтобы исправлять ошибки людей. Но кто же тогда будет исправлять ошибки компьютера?..

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Сообщение Nord777 » 13.10.2007 (Сб) 20:59

Обьявил правильно?
Код: Выделить всё
    <DllImport("user32.dll", SetLastError:=True)> _
    Private Shared Function ScreenToClient(ByVal hWnd As IntPtr, ByRef lpPoint As POINT) As Boolean
    End Function


Код: Выделить всё
    <System.Runtime.InteropServices.StructLayout(Runtime.InteropServices.LayoutKind.Sequential)> _
    Public Structure POINT
    Public X As Integer
    Public Y As Integer

    Public Sub New(ByVal X As Integer, ByVal Y As Integer)
        Me.X = X
        Me.Y = Y
    End Sub
    End Structure
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

AnarCky
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 229
Зарегистрирован: 20.11.2006 (Пн) 20:12
Откуда: Россия, Екатеринбург.

Сообщение AnarCky » 14.10.2007 (Вс) 6:09

Ну да. Только немного не так. А почему у тебя функция возвращает Boolean? вот:
Код: Выделить всё

Private Structure POINTAPI
   Public x As Int32
   Public y As Int32
End Structure

Private Declare Function ScreenToClient Lib "user32.dll" _
       (ByVal hWnd As IntPtr, ByRef lpPoint As POINTAPI) As Int32

объясни пожалуйста: зачем нужен конструктор в объявлении структуры?
Компьютеры были придуманы чтобы исправлять ошибки людей. Но кто же тогда будет исправлять ошибки компьютера?..

AnarCky
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 229
Зарегистрирован: 20.11.2006 (Пн) 20:12
Откуда: Россия, Екатеринбург.

Сообщение AnarCky » 14.10.2007 (Вс) 6:47

И еще: я попробовал заменить свое объявление на твое, тогда пишет ситаксическую ошибку здесь: "<DllImport...",
ошибка: "Type "DllImport" is not defined"
и здесь: "...Sequential)> _" (подчеркивает символ '>')
ошибка: "Atribute specifier is not a complete statement. Use a line continuation to apply the attribute to the following sentence."

а что такое "line continuation", это вот этот символ '_' да? Как его правильно там поставить надо?
И зачем вообще нужно это предложение, что оно делает: ?
"<System.Runtime.InteropServices.StructLayout(Runtime.InteropServices.LayoutKind.Sequential)> _"
Компьютеры были придуманы чтобы исправлять ошибки людей. Но кто же тогда будет исправлять ошибки компьютера?..

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Сообщение Nord777 » 14.10.2007 (Вс) 20:03

объясни пожалуйста: зачем нужен конструктор в объявлении структуры?
Для удобства. Чтобы инициализировать одной строкой
Код: Выделить всё
Dim pnt as New POINT(10,10)


я попробовал заменить свое объявление на твое, тогда пишет ситаксическую ошибку здесь: "<DllImport...",
ошибка: "Type "DllImport" is not defined"

Код: Выделить всё
Imports System.Runtime.InteropServices


Код: Выделить всё
а что такое "line continuation", это вот этот символ '_' да?
Да. Код ниже - это всё одна строка. Просто в экран не влезла.
Код: Выделить всё
    <System.Runtime.InteropServices.StructLayout(Runtime.InteropServices.LayoutKind.Sequential)> _
    Public Structure POINT


И зачем вообще нужно это предложение, что оно делает: ?
"<System.Runtime.InteropServices.StructLayout(Runtime.InteropServices.LayoutKind.Sequential)>
Это называется атрибутом. И он говорит, что данные в памяти будут находится в той же последовательности, что и в обьявлении. Это важно при передаче структур и классов в Win32Api.
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

ZeroX
Бывалый
Бывалый
 
Сообщения: 207
Зарегистрирован: 29.04.2003 (Вт) 12:36
Откуда: Мой адрес не дом и не улица, мой адрес Советский Союз

Сообщение ZeroX » 14.10.2007 (Вс) 23:09

А это заюзать слабо
Код: Выделить всё
System.Windows.Forms.Screen
System.Drawing.Point
Каждый warning мечтает стать error'om

AnarCky
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 229
Зарегистрирован: 20.11.2006 (Пн) 20:12
Откуда: Россия, Екатеринбург.

Сообщение AnarCky » 15.10.2007 (Пн) 20:32

Nord777
Теперь понятно... Спасибо!
Подключил "System.Runtime.InteropServices" и теперь все работает.
Компьютеры были придуманы чтобы исправлять ошибки людей. Но кто же тогда будет исправлять ошибки компьютера?..


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот и гости: 108

    TopList