| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1409 人关注过本帖
标题:显示桌面和最小最大所有窗体的几个方法
只看楼主 加入收藏
weiyi75
Rank: 1
等 级:新手上路
威 望:1
帖 子:43
专家分:0
注 册:2006-9-7
收藏
 问题点数:0 回复次数:3 
显示桌面和最小最大所有窗体的几个方法

1.显示桌面可以调用X路径Application Data\Microsoft\Internet Explorer\Quick Launch\显示桌面.scf这个Windows Explorer Command文件,这个路径因人而异,需要获取。

2.也可以用Win键+M键激活

3.就是常用的枚举顶层(top-level)窗口EnumWindows获取所有最小化和可见状态的窗体句柄,然后用ShowWindow调用可用状态

具体VB实现如下

'窗体部分,四个按钮,名字看代码就知道。

Option Explicit

Private Sub cmdMin_Click()

Call EnumWindows(AddressOf EnumWindowsProc, 0&) '通过参数调用决定是最小化

cmdMin.Enabled = False
cmdMax.Enabled = True

End Sub

Private Sub cmdShowDeskTop_Click() '调用显示桌面.scf

Dim strBuffer As String
Dim strPath As String

strBuffer = String$(MAX_PATH, 0)

SHGetSpecialFolderPath Me.hwnd, strBuffer, CSIDL_APPDATA, 0

strPath = Left$(strBuffer, InStr(1, strBuffer, Chr$(0)) - 1)

strPath = strPath & "\Microsoft\Internet Explorer\Quick Launch\显示桌面.scf"

ShellExecute Me.hwnd, "Open", strPath, "", "", 1

cmdMin.Enabled = False
cmdMax.Enabled = True

End Sub

Private Sub cmdHot_Click()

DoAction (2) '组合热键显示桌面

cmdMin.Enabled = False
cmdMax.Enabled = True

End Sub

Private Sub cmdMax_Click()

Call EnumWindows(AddressOf EnumWindowsProc, 1&) '通过参数调用决定是最大化

cmdMin.Enabled = True
cmdMax.Enabled = False

End Sub

'模块部分

Option Explicit

Private Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long

Private Const SW_MINIMIZE = 6
Private Const SW_SHOWMAXIMIZED = 3

Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long

Private Const WS_MINIMIZEBOX = &H20000
Private Const WS_MAXIMIZEBOX = &H10000
Private Const WS_VISIBLE = &H10000000
Private Const GWL_STYLE = (-16)

'EnumWindows是一个与EnumWindows或EnumDesktopWindows一起使用的应用程序定义的回调函数,它接收顶层窗口句柄。
'WNDENUMPROC定义一个指向这个回调函数的指针。EnumWindowsProc是应用程序定义函数名的位置标志符。

'参数:

'hwnd: 顶层窗口句柄。
'lParam: 指定在EnumWIndowsh或EnumDesktopWindows中的应用程序定义值。

'返回值:为继续列表,回调函数必须返回TRUE;若停止列表,它必须返回FALSE。
'备注:应用程序必须通过传递给EnumWindows或EnumDesktopWindows应用程序地址来注册这个回调函数。

Declare Function EnumWindows Lib "user32" (ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long

'获得特定的路径名,调用显示桌面.scf

Declare Function SHGetSpecialFolderPath Lib "shell32.dll" Alias _
"SHGetSpecialFolderPathA" (ByVal hwndOwner As Long, _
ByVal lpszPath As String, ByVal nFolder As Long, ByVal fCreate As Long) As Long

Public Const CSIDL_APPDATA = &H1A
Public Const MAX_PATH = 260

' 查找与指定文件关联在一起的程序的文件名

'返回值Long,非零表示成功,零表示失败。会设置GetLastError

'参数 类型及说明

'hwnd Long,指定一个窗口的句柄,有时候,windows程序有必要在创建自己的主窗口前显示一个消息框
'lpOperation String,指定字串“open”来打开lpFlie文档,或指定“Print”来打印它
'lpFile String,想用关联程序打印或打开一个程序名或文件名
'lpParameters String,如lpszFlie是可执行文件,则这个字串包含传递给执行程序的参数
'lpDirectory String,想使用的完整路径
'nShowCmd Long,定义了如何显示启动程序的常数值。参考ShowWindow函数的nCmdShow参数

Public Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" _
(ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, _
ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long

'keybd_event这个函数模拟了键盘行动

'参数 类型及说明

'bVk Byte,欲模拟的虚拟键码
'bScan Byte,键的OEM扫描码
'dwFlags Long,零;或设为下述两个标志之一
'KEYEVENTF_EXTENDEDKEY 指出是一个扩展键,而且在前面冠以0xE0代码
'KEYEVENTF_KEYUP 模拟松开一个键
'dwExtraInfo Long,通常不用的一个值。api函数GetMessageExtraInfo可取得这个值。允许使用的值取决于特定的驱动程序

Private Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)

Private Const VK_LWIN = &H5B
Private Const KEYEVENTF_KEYUP = &H2
Private Const VK_APPS = &H5D
Private Const VK_PLAY = &HFA

'该函数是EnumWindows的回调函数,EnumWindows函数将遍历的窗口句柄传递到hwnd参数中

Public Function EnumWindowsProc(ByVal hwnd As Long, ByVal lParam As Long) As Long

Dim lngStyle As Long

lngStyle = GetWindowLong(hwnd, GWL_STYLE)

Select Case lParam

Case 0

If ((lngStyle And WS_MINIMIZEBOX) = WS_MINIMIZEBOX) Then '如果窗口具有最小化按钮并且窗口是可见的就将该窗口最小化

If ((lngStyle And WS_VISIBLE)) Then

Call ShowWindow(hwnd, SW_MINIMIZE)

End If

End If

Case 1

If ((lngStyle And WS_MAXIMIZEBOX) = WS_MAXIMIZEBOX) Then '如果窗口具有最小化按钮并且窗口是可见的就将该窗口最小化

If ((lngStyle And WS_VISIBLE)) Then

Call ShowWindow(hwnd, SW_SHOWMAXIMIZED)

End If

End If

End Select

EnumWindowsProc = True

End Function

Public Sub DoAction(Index As Integer) '模拟按键

Dim VK_ACTION As Long

Select Case Index

Case 0

VK_ACTION = vbKeyE '打开资源管理器

Case 1

VK_ACTION = vbKeyF3 '查找文件

Case 2

VK_ACTION = vbKeyM '最小化所有窗口

Case 3

VK_ACTION = vbKeyR '运行程序

Case 4

VK_ACTION = VK_LWIN '弹出Win菜单

Case 5

VK_ACTION = &H5E '将计算机转入睡眠状态

Case 6

VK_ACTION = vbKeyF1 '执行Windows帮助

End Select

Call keybd_event(VK_LWIN, 0, 0, 0) '按下WIN键
Call keybd_event(VK_ACTION, 0, 0, 0) '用户按键
Call keybd_event(VK_LWIN, 0, KEYEVENTF_KEYUP, 0) '模拟松开按键

End Sub

截图

图片附件: 游客没有浏览图片的权限,请 登录注册

搜索更多相关主题的帖子: 窗体 
2006-09-30 16:43
miker99
Rank: 1
等 级:新手上路
帖 子:45
专家分:0
注 册:2006-9-13
收藏
得分:0 

楼主.....

为什么我按照你的方法作,
却提示我SW_SHOWMAXIMIZED
变量未被定义啊....
这个常量应当怎么定义.

你是怎么查到
API函数内常量的系统代码
Const XXXX(常量)= &H**
后边的&H**你是怎么差到的,
可以告诉我下没??????


2006-10-01 09:26
xinfresh
Rank: 4
等 级:贵宾
威 望:13
帖 子:594
专家分:0
注 册:2006-1-13
收藏
得分:0 
写得挺好

E-mail:xinfresh@QQ:383094053校内:http:///getuser.do?id=234719042
2006-10-03 14:34
weiyi75
Rank: 1
等 级:新手上路
威 望:1
帖 子:43
专家分:0
注 册:2006-9-7
收藏
得分:0 

常数 值 描述

vbKeyLButton 0x1 鼠标左键
vbKeyRButton 0x2 鼠标右键
vbKeyCancel 0x3 CANCEL 键
vbKeyMButton 0x4 鼠标中键
vbKeyBack 0x8 BACKSPACE 键
vbKeyTab 0x9 TAB 键
vbKeyClear 0xC CLEAR 键
vbKeyReturn 0xD ENTER 键
vbKeyShift 0x10 SHIFT 键
vbKeyControl 0x11 CTRL 键
vbKeyMenu 0x12 MENU 键
vbKeyPause 0x13 PAUSE 键
vbKeyCapital 0x14 CAPS LOCK 键
vbKeyEscape 0x1B ESC 键
vbKeySpace 0x20 SPACEBAR 键
vbKeyPageUp 0x21 PAGE UP 键
vbKeyPageDown 0x22 PAGE DOWN 键
vbKeyEnd 0x23 END 键
vbKeyHome 0x24 HOME 键
vbKeyLeft 0x25 LEFT ARROW 键
vbKeyUp 0x26 UP ARROW 键
vbKeyRight 0x27 RIGHT ARROW 键
vbKeyDown 0x28 DOWN ARROW 键
vbKeySelect 0x29 SELECT 键
vbKeyPrint 0x2A PRINT SCREEN 键
vbKeyExecute 0x2B EXECUTE 键
vbKeySnapshot 0x2C SNAPSHOT 键
vbKeyInsert 0x2D INSERT 键
vbKeyDelete 0x2E DELETE 键
vbKeyHelp 0x2F HELP 键
vbKeyNumlock 0x90 NUM LOCK 键
A 至 Z 键与 A 杴 Z 字母的 ASCII 码相同:

常数 值 描述
vbKeyA 65 A 键
vbKeyB 66 B 键
vbKeyC 67 C 键
vbKeyD 68 D 键
vbKeyE 69 E 键
vbKeyF 70 F 键
vbKeyG 71 G 键
vbKeyH 72 H 键
vbKeyI 73 I 键
vbKeyJ 74 J 键
vbKeyK 75 K 键
vbKeyL 76 L 键
vbKeyM 77 M 键
vbKeyN 78 N 键
vbKeyO 79 O 键
vbKeyP 80 P 键
vbKeyQ 81 Q 键
vbKeyR 82 R 键
vbKeyS 83 S 键
vbKeyT 84 T 键
vbKeyU 85 U 键
vbKeyV 86 V 键
vbKeyW 87 W 键
vbKeyX 88 X 键
vbKeyY 89 Y 键
vbKeyZ 90 Z 键
0 至 9 键与数字 0 杴 9 的 ASCII 码相同:

常数 值 描述

vbKey0 48 0 键
vbKey1 49 1 键
vbKey2 50 2 键
vbKey3 51 3 键
vbKey4 52 4 键
vbKey5 53 5 键
vbKey6 54 6 键
vbKey7 55 7 键
vbKey8 56 8 键
vbKey9 57 9 键
下列常数代表数字键盘上的键:

常数 值 描述
vbKeyNumpad0 0x60 0 键
vbKeyNumpad1 0x61 1 键
vbKeyNumpad2 0x62 2 键
vbKeyNumpad3 0x63 3 键
vbKeyNumpad4 0x64 4 键
vbKeyNumpad5 0x65 5 键
vbKeyNumpad6 0x66 6 键
vbKeyNumpad7 0x67 7 键
vbKeyNumpad8 0x68 8 键
vbKeyNumpad9 0x69 9 键
vbKeyMultiply 0x6A MULTIPLICATION SIGN (*) 键
vbKeyAdd 0x6B PLUS SIGN (+) 键
vbKeySeparator 0x6C ENTER 键
vbKeySubtract 0x6D MINUS SIGN (杴) 键
vbKeyDecimal 0x6E DECIMAL POINT (.) 键
vbKeyDivide 0x6F DIVISION SIGN (/) 键
下列常数代表功能键:

常数 值 描述

vbKeyF1 0x70 F1 键
vbKeyF2 0x71 F2 键
vbKeyF3 0x72 F3 键
vbKeyF4 0x73 F4 键
vbKeyF5 0x74 F5 键
vbKeyF6 0x75 F6 键
vbKeyF7 0x76 F7 键
vbKeyF8 0x77 F8 键
vbKeyF9 0x78 F9 键
vbKeyF10 0x79 F10 键
vbKeyF11 0x7A F11 键
vbKeyF12 0x7B F12 键
vbKeyF13 0x7C F13 键
vbKeyF14 0x7D F14 键
vbKeyF15 0x7E F15 键
vbKeyF16 0x7F F16 键

2006-10-04 23:02
快速回复:显示桌面和最小最大所有窗体的几个方法
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.025683 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved