(大家都会遇见的问题)vb6.0/98里编的调用API的程序到了XP为什么没有作用?(有详细叙述)

whqzyl2003 2004-09-14 12:08:56
我在98/VB6里面编写一个程序为了动态修改屏幕分辨率而使用了GetDeviceCaps和ChangeDisplaySettings函数,分别是gdi32.dll和user32.dll这两个的。可是编好的程序在98里运行正常,可以修改屏幕分辨率,但程序在XP里运行后不能改变屏幕分辨率,即使弄成安装包后安装在XP里在运行也是没有作用。考虑到98里的gdi32.dll、user32.dll与XP里的两个同名DLL的版本不一样,我重新改写了代码(我装的是98/XP双系统,98在c盘,XP在D盘),声明函数时加了两个DLL的路径:Private Declare Function ChangeDisplaySettings
Lib "c:\windows\system\User32.dll" Alias "ChangeDisplaySettingsA"
(ByVal lpDevMode As Long, ByVal dwflags As Long) As Long
但一编译就报告找不到User32.dll,但该文件确实在呀!真是不知道如何才好!
请高手指点:
1。调用API函数后的程序难道只能在98系统里运行吗?那样程序不是不能适应操作系统了??
2,根据语法,声明API函数时可以指定DLL的路径的,可为什么实际不行??
qq:33326935, E-maie:whqzyl2001@etang.com

一下是代码和过程:

---- 一、打开一个标准的EXE工程。

---- 二、在“工程”菜单栏下,选取“添加模块”,为工程添加一个模块。

---- 并在模块中添加如下代码:

‘---------------以下代码用于得到屏幕的设置参数--------------
Declare Function GetDeviceCaps Lib
"gdi32" (ByVal hdc As Long,
ByVal nIndex As Long) As Long
‘取指定设备信息API函数
Public Const HORZRES = 8
‘三个屏幕常量
Public Const VHORZRES = 10
Public Const BITSPIXEL = 12
‘---------------通过字符COPY进行数据类型转换--------------
Private Declare Function lstrcpy Lib "kernel32"
Alias "lstrcpyA" (lpString1 As Any, lpString2 As Any) As Long
‘------------------以下结构用于屏幕的初始化-----------------
Const CCHDEVICENAME = 32
Const CCHFORMNAME = 32

Private Type DEVMODE
dmDeviceName As String * CCHDEVICENAME
dmSpecVersion As Integer
dmDriverVersion As Integer
dmSize As Integer
dmDriverExtra As Integer
dmFields As Long
dmOrientation As Integer
dmPaperSize As Integer
dmPaperLength As Integer
dmPaperWidth As Integer
dmScale As Integer
dmCopies As Integer
dmDefaultSource As Integer
dmPrintQuality As Integer
dmColor As Integer
dmDuplex As Integer
dmYResolution As Integer
dmTTOption As Integer
dmCollate As Integer
dmFormName As String * CCHFORMNAME
dmUnusedPadding As Integer
dmBitsPerPel As Integer
dmPelsWidth As Long
dmPelsHeight As Long
dmDisplayFlags As Long
dmDisplayFrequency As Long
End Type
‘------------------设置屏幕的核心API-----------------
Private Declare Function ChangeDisplaySettings
Lib "User32" Alias "ChangeDisplaySettingsA"
(ByVal lpDevMode As Long, ByVal dwflags As Long) As Long
‘------------------设置屏幕的函数-----------------
Public Function SetDispMode(Width As Integer,
Height As Integer, Color As Integer) As Long
(SetDispMode是自己构造的更改屏幕设置的函数来,
它的三个参数Width、Height和Color分别是屏幕的横向分辨率、
纵向分辨率,颜色位数,其值可为24,16,0等。0为原有颜色设置。)
Const DM_PELSWIDTH = &H80000
Const DM_PELSHEIGHT = &H100000
Const DM_BITSPERPEL = &H40000
Dim NewDevMode As DEVMODE
Dim pDevmode As Long
With NewDevMode
.dmSize = 122
If Color = 0 Then
‘如果Color=0则只改变屏幕的分辨率,而不改变色彩。
.dmFields = DM_PELSWIDTH Or DM_PELSHEIGHT
Else
‘如果Color不等0则改变屏幕的分辨率和色彩。
.dmFields = DM_PELSWIDTH Or DM_PELSHEIGHT Or DM_BITSPERPEL
End If
.dmPelsWidth = Width
.dmPelsHeight = Height
If Color < > 0 Then
.dmBitsPerPel = Color
End If
End With
pDevmode = lstrcpy(NewDevMode, NewDevMode)
‘得到一个指向NewDevMode结构的Long型的指针。
ChangeDisplaySettings pDevmode, 0
End Function

---- 三、在工程窗体中,加入两个按钮Command1和Command2,其Caption属性分别为“800x600x16”和“恢复原设置”。

---- 其程序代码为:

‘窗口的“通用|声明”区
Option Explicit
Dim H, V, Color As Long
’声名变量,用于保存最初屏幕设置
Private Sub Form_Load()
‘---------------以下代码用于得到最初的屏幕设备--------------
H = GetDeviceCaps(Form1.hdc, HORZRES)
V = GetDeviceCaps(Form1.hdc, VHORZRES)
Color = GetDeviceCaps(Form1.hdc, BITSPIXEL)
End Sub

Private Sub Command1_Click()
‘调用SetDispMode函数改变屏幕设置
SetDispMode 800, 600, 16
End Sub

Private Sub Command2_Click()
‘恢复最初屏幕设置
SetDispMode CInt(H), CInt(V), CInt(Color)
End Sub

---- 四、将程序编译执行。

---- 本程序执行后,如果单击Command1,则您的计算机屏幕显示模式将被设置为“800x600x16”的显示模式;如果单击Command2, 则您的计算机屏幕显示模式将被设置为原来的显示模式。此程序稍加修改,即可放置于桌面或任务栏中,直接快捷的修改屏幕设置。


...全文
59 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
rainstormmaster 2004-09-14
  • 打赏
  • 举报
回复
http://www.vb-helper.com/howto_change_display_mode_xp.html
jam021 2004-09-14
  • 打赏
  • 举报
回复
看的我好困,我帮你顶一下

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧