分享
 
 
 

Shell语句用法心得

王朝vb·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

一. 调用系统“创建快捷方式”向导

是否为VB不支持创建快捷方式而于着急呢?虽然您可以调用vb5stkit.dll中的fCreateShellLink函数,但它是为安装程序设计的,快捷方式的默认路径总是从当前用户的“\Start Menu\Programs”开始,也就是说,如果您的Windows95装在C盘上,您无法通过 fCreateShellLink 函数把快捷方式创建到D盘上去。

现在,给大家介绍一种极为方便、巧妙的方法: 用Shell语句调用系统“创建快捷方式”向导。

新建一个项目,在窗体上放一个按钮,双击此按钮,加入以下代码:

Private Sub Command1_Click()

Open App.Path & "\temp.lnk" For Output As #1

Close #1 '以上两句在程序所在目录建立一个临时文件

Shell "Rundll32.exe AppWiz.Cpl,NewLinkHere "& App.Path & "\temp.lnk"

End Sub

(注意:Shell语句中NewLinkHere后面跟着一个空格才是引号,否则将出错。)

运行程序,按一下命令按钮,怎么样?“创建快捷方式”向导出现了,如果创建成功,快捷方式将取 代临时文件temp.lnk的位置,如果选取消,temp.lnk 也会自动消失。当然,您可以在硬盘的任意位置建立 temp.lnk。好,现在又可以为您的程序增添一项新功能了。Enjoy!

二. Rundll32.exe的用途

我们知道,用Shell语句只能调用可执行文件,即 exe、com、bat 和 pif 文件,有时我们想要调用其他一 些系统功能该怎么办呢?此时,Windows提供的 Rundll32.exe可大显身手了。下面我们来认识一下这些用法,也许会给您带来一点惊喜。

1.要打开设置系统时间的控制面板文件 (Timedate.cpl),只需运行如下代码:

Shell "Rundll32.exe

Shell32.dll,Control_RunDLL Timedate.cpl"

至于打开其他控制面板文件,相信您一定能够举一反三,尝试一下,换个文件名就成了。

2.要运行某一快捷方式(*.lnk)则可以用以下代码:

She11 "Rundll32.exe url.dll, FileProtocolHandler X"

(X代表要运行的文件,包括路径,下同。)

3. 也可以这样写来打开ActiveMovie控制:

Shell "RUNDLL32.EXE amovie.ocx,Rundll",1

而用Shell "RUNDLL32.EXE amovie.ocx,Rundll /play X",1 将直接播放媒体文件。

4. Shell "rundll32.exe desk.cpl,InstallScreenSaver X”当然是安装屏幕保护啦,如果你写了一个屏幕保护程序,那么可以在安装程序中写上它,而不一定要装到system目录下。顺便提一下,VB不是自捞一个“Application Setup Wizard”么?它的VB源代码都在安装目录下的 “\setupkit\setup1”中放着呢,好好把它研究一下。 你完全能做出富有个性的安装程序来。

5.按住shift键,右击某一文件,菜单中会出现 “打开方式”选项,这也许已不是什么秘密。但现在, 用shell "rundll32.exe shell32.dll OpenAs_RunDLL X" 便能直接调用“打开方式”框。

6. 甚至能用这样一句来打印文件(包括HTML所 支持的所有文本与图像格式):

Shell "rundll32.exe MSHTML.DLL,PrintHTML X”, 1

怎么样?是不是小有收获呢?这下,您一定会对 Rundll32.exe这个平时不起眼的文件另眼相待了,它可是系统运行必不可少的部件呢!其实 Shell+Rundll32 还能调用其他许多系统功能,比如关于NetMeeting和Telnet方面的。如果您有兴趣,可以 到往册表的“我的电脑\HKEY_CLASSES_ROOT\”或“我的电脑\HKEY_LOCAL_MACHINE\Software\CLASSES”下 去看看,本文的内容大都是从那里“抄”来的。只要有足够的决心、信心、耐心,您一定能发现更多有价值的东西。Good luck!

再谈Shell语句的用法

笔者曾经在98年《新潮电子》第10期上写过一篇《shell语句用法心得》,看过此文的朋友一定会觉得其中的主角其实是Rundll32.exe,而非shell语句,因为只要知道Rundll32.exe的用法,在任何编程 语言中均可调用。事实上用这种方法来调用系统功能既方便又安全,着实让人体会到微软和windows体贴、温柔的一面。上回疏漏了许多有用有趣的用法,此番又长了不少经验值,不敢不与大家共享,也算是对上文的补充吧。

一、关于Rundll32.exe

过去,你曾经为了自己编的文件管理器能Format 磁盘、浏览器能自动拨号连接而求助于那位高傲的API。现在,Rundll32.exe向你提供了更为平易近人的方法来实现这些功能。

附表中列举了本人总结出的一些精华,耐心的你是否会发现,有时只要一条语句便可解开心中的难题呢?(shell语句的执行格式为shell加上表中列举的相应命令。例如,要调用关机程序则为:shell "rundll32.exe user.exe,exitwindOws")

调用模块 命令结果

rundll32.exe shell32.dll,Control_RunDLL 打开控制面板

SHELL32.DLL

rundll32.exe shell32,SHHelpShortcuts_Rundll PrintersFolder 打开打印机文件夹

rundll32.exe shell32,SHHelpShortcuts_Rundll FontsFolder 打开字体文件夹

rundll32.exe shell32,SHHelpShortcuts_Rundll AddPrinter 添加新打印机向导

rundll32.exe shell32,SHformatDrive 格式化软盘

SYSDM.CPL

rundll32.exe shell32,Control_RunDLL sysdm.cpl 系统属性,常规

rundll32.exe shell32,Control_RunDLL sysdm.cpl,,l 系统属性,设备管理器

rundll32.exe shell32,Control_RunDLL sysdm.cpl,,3 系统属性,性能

rundll32.exe shell32,Control_RunDLL sysdm.cpl @1 添加新硬件向导

APPWIZ.CPL

rundll32.exe shell32,Control_RunDLL appwiz.cpl,,1 添加/删除程序

rundll32.exe shell32,Control_RunDLL appwiz.cpl,,2 安装Windows部件

rundll32.exe shell32,Control_RunDLL appwiz.cpl,,3 制作启动盘

DISKCOPY.DLL

rundll32.exe diskcopy.dll,DiskcopyRundll 复制磁盘

RNAUI.DLL

rundll32.exe rnaui.dll,RnaDial x (x为连接名称) 打开拨号边接对话框,若已连接,则显示连接状态对话框

rundll32.exe rnaui.dll,RnaWizard 新建拨号连接向导

DESK.CPL

rundll32.exe shell32,Control_RunDLL desk.cpl,,0 选择桌面背景

rundll32.exe shell32,Control_RunDLL desk.cpl,,1 选择屏幕保护

rundll32.exe shell32,Control_RunDLL desk.cpl,,2 选择外观

rundll32.exe shell32,Control_RunDLL desk.cpl,,3 设置显示属性

MAIN.CPL

rundll32.exe shell32,Control_RunDLL main.cpl @0 设置鼠标属性

rundll32.exe shell32,Control_RunDLL main.cpl @1 设置键盘属性,速度

rundll32.exe shell32,Control_RunDLL main.cpl @1,,1 设置键盘属性,语言

rundll32.exe shell32,Control_RunDLL main.cpl @2 打开打印机文件夹

rundll32.exe shell32,Control_RunDLL main.cpl @3 打开字体属性

rundll32.exe shell32,Control_RunDLL main.cpl @4 设置输入法

MODEM.CPL

rundll32.exe shell32,Control_RunDLL modem.cpl,,add 添加调制解调器向导

MMSYS.CPL

rundll32.exe shell32,Control_RunDLL mmsys.cpl @1 设置声音属性(也可以加入,,0到,,4的参数以选择不同的标签)

UESR.EXE

rundll32.exe user.exe,exitwindows 关闭计算机

二、如何确定Shell语句调用的程序已经关闭

这个标题确实太长,但它确实概括了本节的内容。当你需要等待由Shell启动的应用程序运行完毕时,便会发现Shell语句只管调用,之后就撒手不管了,于是我们不得不动用一下API函数了。当然我们可以用API来完成全部的工作,但是如果那样的话,我们将要面临CreateProcess这个非常复杂的函数,光写下它和相关结构类型的宣告就超出一页纸了。别误会,我说这些的目的只是为了让大家体会到下面我们将要做的是多么简单的事。

只需按以下步骤step by step,便OK了。

1.新建一个项目,在窗体上放一个command1,再添加一个Module。

2. 在Module中写入如下代码:

Option Explicit

以下声明了OpenProcess,GetExitCodeProcess 和Closeandle 三个API函数

Public Declare Function OpenProcess Lib"ker nel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long

Public Declare Function GetExitcodeProcess Lib "kernel32" (ByVal hProcess As Long, 1pExitcode As Long) As Long

Public Declare Function Closellandle Lib "Ker nel32" (ByVal hobject As Long) As Long

Publi Const PROCESS_QUERY_INFORMATION= &H400

Public Const STATUS_PENDING = &H103&

3.打开窗体的代码窗口,写入如下代码:

Option Explicit

Private Sub RunShell (cmdline As String) '这个自定义过程完成了所有工作

Dim hProcess As Long

Dim ProcessId As Long

Dim exitCode As Long

ProcessId = Shell(cmdline,1)'此处利用了 Shell当函数使用时返回的任务标识

hProcess=OpenProcess(PROCESS_QUERY_INFOR MATION,False,ProcessId)

Do

Ca11 GetExitCodeProcess(hProcess,exitcode)

DoEvents

Loop While exitCode = STATUS_PENDING

Call CloseHandle (hProcess)

MsgBox cmdline & "已经关闭。"

End Sub

Private Sub Command1_Click()

RunShell "notepad.exe"

End Sub

4·按F5运行,单击Command1运行计事本,关闭计事本将弹出对话框“notepad.exe 已经关闭。”

注意:由于本程序是用一个Do..Loop循环来侦测进程的结束,所以那句DoEvents是绝不能少的,不然你就只能用Ctrl+Break来退出了。

三、激活一个正在运行的程序

让我们来考虑这样一种情况:我们在程序中定义了某一操作是用Shell语句调用Windows的计算器,当 用户重复这一操作时,计算器已经在运行了。如果简单地再使用Shell语句将打开计算器的另一个进程。这显然是不合理的。这时我们需要做的是激活已运行的计算器,下面这段简单的代码帮我们达到了目的、相信大家一看就懂。

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal 1pClassName As String, ByVal 1pWindowName As String) As Long

Private Declare Function BringWindowToTop lib "user32" (ByVal hwnd As Long) As Long

'以上声明了FindWindow和BringWindowToTop两个API函数

Private Sub Command1_Click()

Dim hCalcWnd As Long

hCalcwnd = Findwindow("SciCalc", "计算器")

'这里SciCalc是计算器的窗口类名,详见下一节

lf hCalcWnd=0 Then

Shell ("CALC.EXE", vbNormalFocus)

Else:BringWindowToTop (hCalcWnd)

End lf

End sub

四、如何获得窗口的类名

只是看过上节的读者大部会对窗口的类名提出疑问,本节就是针对这个问题的。通过本节的内容,你还能了解到如何跟踪鼠标,并找出它正经过哪个窗口。 好,让我们一步一步地来,这回代码可能稍多一些。

1.建立一个新项目,在窗体的General Decla rations部分写入以下代码,这些语句定义了要用到 的API函数、常量以及结构。

Option Explicit

Dim gbCancel As Boolean

Private Type POINTAPI

X As Long

Y As Long

End Type

Private Declare Function GetCursorPos Lib "user32" (1pPoint As POINTAPI) As Long

Private Declare Function WindowFromPoint Lib "user32"(ByVal xPoint As Long, ByVal yPoint As long) As Long

Private DeClare Function GetClassName Lib "user32" Alias "GetClassNameA"(ByVal hwnd As Long, ByVal 1pClassName As String, ByVal aMaxCount As Long)As Long

2.在窗体上放一个Command1,把标题改成“开始”,再放一个Label1,以下是事件的代码,也请大家在相应位置写上。

Private Sub Command1_CliCk()

If Command1.Caption ="开始" Then

Command1.Caption = "停止"

Call Track

ElSe

Command1.Caption="开始"

gbCancel = True

End IF

End Sub

Private Sub Form_Load()

gbCancel = False '初始化循环取消变量

End Sub

Private Sub Form_QueryUnload(Cancel As In teger,UnloadMode As Integer)

gbCancel = True '确保循环中断

End Sub

3.最后是关键部分,自定义的过程Track。

Sub Track()

Dim PT_Mouse As POINTAPI

Dim 1CurHwnd As Long

Dim 1PrvHwnd As Long

Dim IX As Long,1Y As Long

Dim tClassName As String

Dim 1Result As Long

1PrvHwnd = 0

Do

Call GetCursorPos(PT_Mouse) '获得鼠标位置

1X =PT_Mouse.x

1Y=PT_Mouse.Y

1CurHwnd = WindowFromPolnt(1X,1Y) '获得鼠标箭头下窗口的句柄

If gbCancel = True Then Exit Do

If 1CurHwnd <> 1PrvHWnd Then '若两值不等则说明经过不同的窗口,保存新值

1PrvHwnd=1CurHwnd

tClassName = String$(256," ") '注意引号间是空格

1Result = GetClassName(1CurHwnd,tClassName,255) '这两句取出类名

tClassName = Left$(tClassName, InStr (tClassName,vbNullChar) -1)

Labell,Caption = "鼠标通过:” & tClassName

'也可写1CurHwnd以获得窗口句柄

End lf

DoEvents '决不可少!切记,切记!

Loop

End sub

运行此程序,按下"开始”按钮后,鼠标所经过的窗口的类名将在Labell中显示出来。

终于写到了最后,我对Shell语句总算是知无不言了。若朋友们能藉本文对Shell语句有更多的了解,我也就“瞑目”了。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有