用vs2010的vb代码,怎样判断当前的显示器是否已经被关闭?比如,我现在用手按显示器的关闭按钮关闭掉显示器,这会发生一个能被vb捕获的事件吗?或者vb能通过调用某函数得知当前显示器是否已经被关闭?请告知具体的完整代码,非常感谢!
解决方案 »
- Combo的事件里面无法Unload 动态创建的控件数组吗?
- 关于注册表里取值的问题,很简单的问题
- 难题求解
- 怎么样才能把一个记录集与spread3.0表格,绑定显示出来
- activebar控件的教程
- 在vb6里如何实现命令行参数?
- 用VB生成的dll组件,在VB的程序里面调用没有问题,在asp里面却报错,请问原因?
- vb对Excel的操作,高分难题
- 为何用APP.TASKVISIBLE=FALSE还是能在组合键里看到我的程序??
- 在下一直在考虑一个问题:vb是否会敌不过vc,c++ builder,java的冲击而退出舞台?
- 【CBM666 请在江苏昆山的同志进来】
- 请问如何用VB实现网络上传?
这里有一个获取监视器品牌、型号的示例,不过是vb.net的
以前486,586的时候,有个显示器接口,叫vesa什么的,那个时候是dos,用汇编调用系统中断服务,可以得到显示器的状态的。
现在用vb了,倒是不知道怎么弄了。windows系统可以自己把显示器暗下来,关闭,在退出黑屏的屏保的时候又显示,那么肯定可以得到显示器状态的,以前得到没数据0是关闭,1是待机什么的,时间太久,都忘记了
后面这个比较靠谱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) 关闭显示器
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)
mov dl,byte 2
int 10
int 20
找牛人给换成VB
起码显示器是连接在显卡上面的。VESA是比较老旧了,就算现在是AGP,AGP2,AGP4,但是都兼容PCI卡的。难道一定要计算机加载了APG才可以用嘛,就用现在最先进的计算机,安装个dos6.22,一样用。就是没发挥现在机器的高新能而已。在windows2008,vista提供了电源管理,ACPI,那里能获取,在XP怎么弄没找到。自己弄的程序现在才能收到屏保系统消息。肯定是可以的,我相信,呵呵
使用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