【问题标题】:How to turn off a monitor using VB.NET code如何使用 VB.NET 代码关闭监视器
【发布时间】:2011-06-03 00:15:32
【问题描述】:

如何使用 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
}

更新:

我使用online developer Fusion converter

【问题讨论】:

  • 转换器可能会抱怨,因为此代码中没有类构造。尝试包装从 using 语句之后到最后一行之后的所有内容:class MonitorShutdown { ...code here }
  • 请注意,C# 代码和翻译后的代码都相当糟糕。 hWnd 应该是 IntPtr,而不是 int。并且在代码中使用魔法常数 (2) 也不是一个好主意。
  • @Konrad Rudolph:我不知道 C# 或 Win32 API。如果您可以完善答案,请执行此操作。它将帮助我和任何未来的访客。
  • 试试 codechanger.com - 我删除了代码 cmets 并且它完美地转换了;)
  • 关于检查当前监视器状态,这可能与stackoverflow.com/questions/203355/…有关

标签: c# .net vb.net visual-studio-2010 screen


【解决方案1】:

是的,已接受答案中的声明不正确。由于传递的参数大小错误,在 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。不太确定它是否有用,对于用户来说很明显该命令由于某种原因不起作用。

【讨论】:

  • 我明白您为什么将Me.Handle.ToInt32() 更改为Me.Handle。但是有必要将SC_MONITORPOWERMonitorShutoff转换/转换为IntPtr吗?
  • 是的,SendMessage 的最后两个参数是 IntPtr,而不是 Integer。消息常量实际上是整数。所以需要转换。 32 位模式下从 4 字节到 4 字节,64 位模式下从 4 字节到 8 字节。 CType() 负责处理,没有 CIntPtr() 函数。 SendMessage 不是很漂亮。
  • 只是一个想法,使用IntPtr 构造函数而不是显式转换会稍微整洁一些吗?即New IntPtr(SC_MONITORPOWER),我认为它少了 3 个字符(无论哪种方式 +1)
  • 有什么办法可以再次唤醒显示器?
【解决方案2】:

试试这个

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

【讨论】:

【解决方案3】:

这个可以在使用 VB 2008 的 Windows 7 上运行。 并且不用担心再次打开显示器,因为这就像电源选项中的“关闭显示器”一样。 显示器关闭并重新打开,您必须按键盘上的任意键或移动鼠标。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-17
    相关资源
    最近更新 更多