用vs2010的vb代码,怎样判断当前的显示器是否已经被关闭?比如,我现在用手按显示器的关闭按钮关闭掉显示器,这会发生一个能被vb捕获的事件吗?或者vb能通过调用某函数得知当前显示器是否已经被关闭?请告知具体的完整代码,非常感谢!

解决方案 »

  1.   

    http://www.lob.cn/sl/note/861.shtml
    这里有一个获取监视器品牌、型号的示例,不过是vb.net的
      

  2.   

    俺脚着不能,要不windows就不屏保了。
      

  3.   

    肯定可以监视到的。
    以前486,586的时候,有个显示器接口,叫vesa什么的,那个时候是dos,用汇编调用系统中断服务,可以得到显示器的状态的。
    现在用vb了,倒是不知道怎么弄了。windows系统可以自己把显示器暗下来,关闭,在退出黑屏的屏保的时候又显示,那么肯定可以得到显示器状态的,以前得到没数据0是关闭,1是待机什么的,时间太久,都忘记了
      

  4.   

    http://www.feiesoft.com/asm/app34-11.htmlhttp://hi.baidu.com/%BA%A3%B7%E7%D6%AE%B2%A9%BF%CD/blog/item/45179325d088a839d40742c1.html 
    后面这个比较靠谱586
    .model flat, stdcall
    option casemap:none
    include  windows.inc
    include  user32.inc
    include  kernel32.inc
    includelib  user32.lib
    includelib  kernel32.lib
    include  macros.asm.code代码:.586
    .model flat, stdcall
    option casemap:none
    include  windows.inc
    include  user32.inc
    include  kernel32.inc
    includelib  user32.lib
    includelib  kernel32.lib
    include  macros.asm.codestart:
     invoke FindWindow,CTXT("Shell_TrayWnd"),NULL
     invoke SendMessage,eax, WM_SYSCOMMAND, SC_MONITORPOWER,2
     invoke ExitProcess,0
    end start  说明:WM_ 窗口消息前缀
    WM_SYSCOMMAND 意为“窗口消息_系统指令”
    SC_ 系统指令
    SC_MONITORPOWER 意为“系统指令_显示器电源”———————————————Ver0.1———————————————
    对于最后一个参数的含义如下:
    -1 (the display is powering on) 打开显示器
    1 (the display is going to low power) 低电状态
    2 (the display is being shut off)  关闭显示器
      

  5.   

    http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/0ff92261-36f1-42f9-8b8f-f07e3b638e30/上面的大哥们去msdn搜索吧,呵呵,http://social.msdn.microsoft.com/Search/en-us?query=get+monitor+state
      

  6.   

    求高人把int 10h弄成VB,看看效果http://www.delorie.com/djgpp/doc/rbinter/id/00/3.html
    mov az,4f10
    mov dl,byte 2
    int 10
    int 20Category: power management INT 10 - VESA VBE/PM (Power Management) v1.0+ - GET DISPLAY POWER STATE AX = 4F10h
    BL = 02h
    Return: AL = 4Fh if function supported
    AH = call status
        00h successful
           BH = current power state (see #00111)
        else failed
    SeeAlso: AX=4F10h/BL=00h,AX=4F10h/BL=01h,AX=A00DhValues for VESA VBE/PM power state: BH
     00h On
     01h standby
     02h suspend
     04h Off
     08h reduced On (for flat screens)
      

  7.   

    上面写错了。在xp cmd下,debug下面可以执行,显示返回成功,ah=0,bh=0mov ax,4f10
    mov dl,byte 2
    int 10
    int 20
    找牛人给换成VB
      

  8.   

    得到显示器的信息,比如通过显卡。
    起码显示器是连接在显卡上面的。VESA是比较老旧了,就算现在是AGP,AGP2,AGP4,但是都兼容PCI卡的。难道一定要计算机加载了APG才可以用嘛,就用现在最先进的计算机,安装个dos6.22,一样用。就是没发挥现在机器的高新能而已。在windows2008,vista提供了电源管理,ACPI,那里能获取,在XP怎么弄没找到。自己弄的程序现在才能收到屏保系统消息。肯定是可以的,我相信,呵呵
      

  9.   

    实验了下面的代码,能得到显示器的状态:
    使用xp+sp3,联想笔记本(台式机也许有差别,没有,无法实验)
    关闭显示用的是系统电源管理那里的1分钟自动关闭显示。关键代码就一点点,要实验还是自己弄成每10秒什么的自己调用一次的形式,把每次得到的状态和时间存起来,然后让程序运行起来,不要动机子,让机子自己关闭显示器1分钟多以后看保存的状态。
    Private Const FILE_SHARE_READ = &H1&
    Private Const FILE_SHARE_WRITE = &H2&
    Private Const GENERIC_READ = &H80000000
    Private Const INVALID_HANDLE_VALUE = -1
    Private Const OPEN_EXISTING = &H3&
    Private Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" ( _
        ByVal lpFileName As String, _
        ByVal dwDesiredAccess As Long, _
        ByVal dwShareMode As Long, _
        ByVal lpSecurityAttributes As Any, _
        ByVal dwCreationDisposition As Long, _
        ByVal dwFlagsAndAttributes As Long, _
        ByVal hTemplateFile As Long _
        ) As Long
    Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
    Private Declare Function GetDevicePowerState Lib "kernel32.dll" (ByVal hDevice As Long, ByRef x As Boolean) As BooleanPrivate Sub Command3_Click()
        Dim mm As String
        Dim ret As Long
        mm = "\\.\LCD"'这里,应该CRT显示器会不一样吧,手里没有机器
        Dim hDevice As Long
                          hDevice = CreateFile( _
                                mm, _
                                GENERIC_READ, _
                                FILE_SHARE_READ Or FILE_SHARE_WRITE, _
                                ByVal 0&, _
                                OPEN_EXISTING, _
                                0, _
                                0)
        If hDevice = INVALID_HANDLE_VALUE Then
            Text1.Text = Text1.Text & vbCrLf & mm & " Open Error"
        Else
            Text1.Text = Text1.Text & vbCrLf & mm & " Open ok"
        End If
        
        Dim x As Boolean
        Dim y As Boolean
        y = GetDevicePowerState(hDevice, x)
        Text1.Text = Text1.Text & vbCrLf & Time & "ret=" & y & " flag=" & x    CloseHandle (hDevice)
    End Sub