Как выключить монитор с помощью кода VB.NET

Как выключить монитор с помощью кода VB.NET? Хорошо, на самом деле я нашел решение C #. Но мне нужно решение VB.NET. Я пробовал онлайн-конвертер C # в VB.NET, но конвертер жалуется на то, что в нем есть ошибки.

Как можно перевести следующий код C # на VB.NET?

using System.Runtime.InteropServices; //to DllImport

public int WM_SYSCOMMAND = 0x0112;
public int SC_MONITORPOWER = 0xF170; //Using the system pre-defined MSDN constants that can be used by the SendMessage() function .

[DllImport("user32.dll")]
private static extern int SendMessage(int hWnd, int hMsg, int wParam, int lParam);
//To call a DLL function from C#, you must provide this declaration.

private void button1_Click(object sender, System.EventArgs e)
{
    SendMessage( this.Handle.ToInt32() , WM_SYSCOMMAND , SC_MONITORPOWER ,2 );//DLL function
}

ОБНОВЛЕНИЕ:

Я использую конвертер Fusion для онлайн-разработчиков.


person user774411    schedule 03.06.2011    source источник
comment
Конвертер, вероятно, жалуется, потому что в этом коде нет конструкции класса. Попробуйте обернуть все, начиная с оператора using и заканчивая последней строкой в ​​этом: class MonitorShutdown { ...code here }.   -  person Alxandr    schedule 03.06.2011
comment
Обратите внимание, что и код C #, и переведенный код в меру ужасны. hWnd должен быть IntPtr, а не int. И наличие магической константы (2) в коде тоже не такая уж хорошая идея.   -  person Konrad Rudolph    schedule 04.07.2011
comment
@ Конрад Рудольф: Я не знаю C # или Win32 API. Если вы можете дать точный ответ, то сделайте это. Это поможет мне и всем будущим посетителям.   -  person user774411    schedule 05.07.2011
comment
попробуйте codechanger.com - я удалил комментарии к коду, и он отлично конвертировался;)   -  person Jeremy Thompson    schedule 15.04.2012
comment
Что касается проверки текущего состояния монитора, это может иметь значение stackoverflow.com/questions/203355/   -  person Jodrell    schedule 19.04.2012


Ответы (3)


Попробуй это

Public WM_SYSCOMMAND As Integer = &H112
Public SC_MONITORPOWER As Integer = &Hf170

<DllImport("user32.dll")> _
Private Shared Function SendMessage(hWnd As Integer, hMsg As Integer, wParam As Integer, lParam As Integer) As Integer
End Function

Private Sub button1_Click(sender As Object, e As System.EventArgs)
    SendMessage(Me.Handle.ToInt32(), WM_SYSCOMMAND, SC_MONITORPOWER, 2)
End Sub
person Bala R    schedule 03.06.2011
comment
@konrad Rudolph: Он отлично работает, но я застрял в одном месте. Пожалуйста, разрешите этот запрос. stackoverflow.com/questions/8280799/ - person Viral Jain; 27.11.2011

Да, заявления в принятом ответе неверны. Случайный сбой возможен в 64-битной версии Windows, поскольку переданные аргументы имеют неправильный размер. Они должны выглядеть так:

Private Const WM_SYSCOMMAND As Integer = &H112
Private Const SC_MONITORPOWER As Integer = &HF170
Private Const MonitorToLowPower As Integer = 1
Private Const MonitorShutoff As Integer = 2

<DllImport("user32.dll")> _
Private Shared Function SendMessage(ByVal hWnd As IntPtr, ByVal hMsg As Integer, _
                          ByVal wParam As IntPtr, ByVal lParam As IntPtr) As IntPtr
End Function

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    SendMessage(Me.Handle, WM_SYSCOMMAND, 
                CType(SC_MONITORPOWER, IntPtr), CType(MonitorShutoff, IntPtr))
End Sub

Вы можете добавить проверку возвращаемого значения SendMessage (), она должна возвращать IntPtr.Zero. Не уверен, что это полезно, пользователю будет довольно очевидно, что команда по какой-то причине не сработала.

person Hans Passant    schedule 15.04.2012
comment
Я понимаю, почему вы изменили Me.Handle.ToInt32() на Me.Handle. Но нужно ли преобразовывать SC_MONITORPOWER и MonitorShutoff в IntPtr? - person Nicholas; 16.04.2012
comment
Да, два последних аргумента SendMessage - это IntPtr, а не Integer. Константы сообщения на самом деле являются целочисленными. Итак, требуется преобразование. От 4 до 4 байтов в 32-битном режиме, от 4 до 8 байтов в 64-битном режиме. CType () позаботится об этом, функции CIntPtr () нет. SendMessage не очень красив. - person Hans Passant; 16.04.2012
comment
Просто идея, будет ли использование конструктора IntPtr вместо явного преобразования немного аккуратнее? т.е. New IntPtr(SC_MONITORPOWER), я думаю, что в нем на 3 символа меньше (+1 в любом случае) - person Jodrell; 19.04.2012
comment
Есть ли способ снова разбудить монитор? - person Alexander Johansen; 03.06.2015

это работает в Windows 7 с использованием VB 2008. и не беспокойтесь о повторном включении монитора, потому что это похоже на «выключить дисплей» в параметрах питания. монитор выключится, и чтобы снова включить его, вам нужно либо нажать любую клавишу на клавиатуре, либо переместить мышь.

Imports System.Runtime.InteropServices

Public Class Monitoroff

Public WM_SYSCOMMAND As Integer = &H112

Public SC_MONITORPOWER As Integer = &HF170

<DllImport("user32.dll", SetLastError:=True)> _
Private Shared Function SendMessage(ByVal hWnd As Integer, ByVal hMsg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer
End Function

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    SendMessage(Me.Handle.ToInt32(), WM_SYSCOMMAND, SC_MONITORPOWER, 2)
End Sub
End Class
person Starkternate    schedule 20.09.2013