首页 > 技术文章

介绍一个输入密码用的InputBox函数

『自从微软提供 AddressOf 函数给VBA后,本以为对于 Excel 窗口控制从此如虎添翼,没想到只是一厢情愿,多次测试结果鲜少圆满达到效果。』这是以前曾经提过的一句话,从此以后就很少碰 CALLBACK 函数了。直到最近看到上面引用的话题,发现问题没想象的严重。像这个 TimeProc callback function 在范例中的使用效果就不错。

要去改变 VBA.InputBox 函数所带出来的对话框属性,首先就要知道该对话框的 Class Name 及其标题,还有其中对象(例如那个输入用的文字框,其 Class Name 是 “Edit”)的 Class Name 及其标题(如果有的话)。如何知道呢?这可以使用 [简易窗口检视器] 来看。怎么看?最简单的办法就是打开另一个 Excel 窗口,写个 VBA 程序叫出InputBox对话框。然后将鼠标移到上头就知道了。当然开 Word 窗口来做也可以的。如下图

有了上述信息就可以使用API:FindWindow,FindWindowEx 取得标的控件的句柄,然后使用 SendMessage 设定相关属性。这些动作都在 TimeProc callback 函数中完成。

最后使用 Windows Multimedia 函数: timeSetEvent 设定定时器,定时启动 TimeProc 函数监看,一旦 InputBox 对话框出现,完成动作随即使用timeKillEvent函数取消定时器。一点都不消耗CPU或内存。其效果如图

参考程序代码

'一般模块 Module1 程序代码

Option Explicit

'API宣告

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _

(ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" _

(ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long

Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" _

(ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long

'timeSetEvent函数请参考:http://msdn2.microsoft.com/en-us/library/ms713423.aspx

Private Declare Function timeSetEvent Lib "winmm.dll" (ByVal uDelay As Long, ByVal uResolution As Long, _

ByVal lpFunction As Long, ByVal dwUser As Long, ByVal uFlags As Long) As Long

Private Declare Function timeKillEvent Lib "winmm.dll" (ByVal uID As Long) As Long

Private Const EM_SETPASSWORDCHAR = &HCC

Dim lTimeID     As Long          'Timer ID

Const pswdInputBoxTitle = "pswdInputBox"     '输入密码的对话框标题

--------------------------------------------------------------------------------

'TimeProc callback 函数请参考:http://msdn2.microsoft.com/en-us/library/ms713420.aspx

Sub TimeProc(ByVal uID As Long, ByVal uMsg As Long, ByVal dwUser As Long, _

ByVal dw1 As Long, ByVal dw2 As Long)

Dim hwd As Long         '输入密码的对话框句柄

'VBA InputBox对话框之Class Name是 "#32770",

'标题为 "pswdInputBox", 这是在InputBox函数的Title引述中自订的

'请注意Application.InputBox方法所出现的对话框Class Name是 "bosa_sdm_XL9"

hwd = FindWindow("#32770", pswdInputBoxTitle)

If hwd <> 0 Then        '若对话框存在

'取得输入的文字框句柄, 该文字框的Class Name是"Edit", 无标题,

'而Application.InputBox方法所出现的对话框之文字框的Class Name是"EDTBX"

hwd = FindWindowEx(hwd, 0, "Edit", vbNullString)

'设定密码字符为 "*", "*"的ASCII码为42

SendMessage hwd, EM_SETPASSWORDCHAR, 42, 0

'设定完成, 取消定时器

timeKillEvent lTimeID

End If

End Sub

--------------------------------------------------------------------------------

'自定义函数pswdInputBox, 是一个输入密码使用的InputBox, 输入的内容都以 "*" 显示.

Function pswdInputBox() As Variant

'启动一个特定的Timer事件, 0.01秒延迟, 0.05秒看一次

lTimeID = timeSetEvent(10, 50, AddressOf TimeProc, 1, 1)

'显示InputBox对话框

pswdInputBox = InputBox(Prompt:="请输入编辑密码", Title:=pswdInputBoxTitle)

End Function

'工作表模块 Sheet1 程序代码

Option Explicit

--------------------------------------------------------------------------------

'选择范围改变事件

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

If ActiveCell.Address = "$B$2" Then     '若作用储存格为B2时

'呼叫pawdInputBox, 并检查返回值

If pswdInputBox <> 123456 Then

'密码不正确, 显示讯息

MsgBox "对不起,密码错误,你无编辑权限!"

'离开B2储存格

Range("A1").Select

End If

End If

End Sub

声明:欢迎各大网站转载本站文章,还请保留一条能直接指向本站的超级链接,谢谢!

时间:2007-09-25 21:19:56,点击:0

HTML输入密码函数,介绍一个输入密码用的InputBox函数相关推荐

  1. 编写一个C程序,实现以下功能:编写一个常规的函数和一个递归函数,两个函数均能将输入的一个字符串以按反序形式的字符串作为返回值。在main函数中输入一行字符串,分别调用两个函数,输出反序后的字符串。

    题目要求: 编写一个C程序,实现以下功能:编写一个常规的函数和一个递归函数,两个函数均能将输入的一个字符串以按反序形式的字符串作为返回值.在main函数中输入一行字符串,分别调用两个函数,输出反序后的 ...

  2. 给定一个数学函数写一个程序来确定该函数是否是双射的

    离散题目11 Time Limit: 1000 msMemory Limit: 65536 KiB Problem Description 给定一个数学函数写一个程序来确定该函数是否是双射的 Inpu ...

  3. php查看变量函数,介绍一些PHP判断变量的函数

    虽然这一特点使用PHP编程非常容易,但它也存在一个重要的缺陷:当你需要测试一个变量的类型时,处理类型比较松散的语言就让人有些迷惑.幸运地是,PHP的开发者注意到这一情况,因此在其中包含了一个函数工具包 ...

  4. oracle nvl函数3个参数,oracle中的函数介绍(一):nvl函数、decode函数、case when函数、sum函数...

    最近做项目接触到的oracle数据库比较多,经常用到里面的一些函数,以前的博客中也介绍过行转列和列转行,这次再简单给大家介绍几个: nvl() NVL(a,b)就是判断a是否是NULL,如果不是返回a ...

  5. Matlab中why函数(一个无用但有趣的函数)

    本文没有干货,纯属划水摸鱼.请大家切勿学习 当你运行自己编写的Matlab程序的时候,可能会遇到各种各样奇葩的问题.这时候如果你一脸蒙圈而又无奈地在命令行窗口中敲出一个why,运行,会如何呢? 很可能 ...

  6. 写一个求平方根的函数求一个整数的平方根因为函数类型是整形所以平方根的结果是整数,例如5,的平方根是2,而不是2.3...

    # include <stdio.h> int sqrt(int x) {     int target = 1;     while (target * target <= x) ...

  7. 【 MATLAB 】rem 函数介绍

    rem函数和mod函数很相似,二者认真看一个,另一个看一下区别即可. mod函数介绍:[ MATLAB ]mod 函数介绍 rem Remainder after division Syntax r ...

  8. 17.JavaScript函数的不同形态,函数是个表达式、函数是一个值,函数声明和函数表达式的区别

    函数的不同形态 文章目录 函数的不同形态 函数可以是个表达式 函数的本质是一个值 回调函数 函数表达式和函数声明的差别 课后作业 函数可以是个表达式 在上文<JavaScript函数>我们 ...

  9. C语言---函数介绍详解

    生活的全部意义在于无穷地探索尚未知道的东西,在于不断地增加更多的知识--左拉 文章目录 前言 函数 模块化程序设计方法 函数的定义 函数的分类 函数定义角度 库函数 自定义函数 函数形式角度 无参函数 ...

  10. C语言返回指针的函数,指针函数,让一个函数返回一个字符串

    C语言函数返回指针的函数(指针函数) 什么是返回指针的函数 一个函数可以返回一个整形值 字符型值 实型值 1.如果一个函数它的返回值是一个地址(是一个指针的话),这个函数是一个返回值是指针即指针函数. ...

最新文章

  1. 如何使用 Python 或 Bash动态生成 Jekyll 配置文件
  2. python canvas画弧度_只要十分钟,python绘图神器turtle了解一下?
  3. [一] 详细讲解: 线性表链式存储结构 中的 单链表; (数据结构和算法)
  4. iOS UILable高度自适应
  5. CentOS 7.6 安装 Maven 3.6.3
  6. 回调java 简书_web3j函数回调使用详解
  7. C语言试题十六之写删除字符串中指定下标的字符。其中,a指向原字符串,删除后的字符串存放在b所指的数组中,n中存放指定的下标。
  8. “模板法”学习类pinterest瀑布流的前端实现
  9. cpython是什么_CPython是什么?PyPy是什么?Python和这两个东西有什么关系?
  10. 阶段1 语言基础+高级_1-3-Java语言高级_05-异常与多线程_第3节 线程同步机制_5_同步技术的原理...
  11. RT struct 文件 保存为nii文件及解析
  12. 【矢量分析】工科矢量分析公式大全
  13. 积分形式的詹森不等式_詹森不等式
  14. 什么是SYN包 以及SYN攻击原理
  15. mac端锐捷无法验证服务器,还在为mac无法用锐捷认证校园网登陆而郁闷吗?
  16. Android体重档案代码,Android开发实现的标准体重计算器功能示例
  17. SAP-MM 常见移动类型
  18. Sqlserver中的日期类型值不能小于1753年
  19. Python科学计算的瑞士军刀——Anaconda 安装与配置
  20. sql_trace跟踪分析方法

热门文章

  1. 使用Python根据视频链接下载MP4视频
  2. 怎么管理好精力,让自己每天精力充沛
  3. 2.灰尘对计算机的影响,灰尘对电脑有影响不?
  4. RAB, RB, SRB
  5. 设计模式之面向对象七大基本原则
  6. PCB多层板设计总结-层的分布设置
  7. 100层楼扔两个鸡蛋的问题
  8. html 怎么写出实心园,教您如何使用css3实现实心圆
  9. python seaborn教程_Seaborn官方教程中文教程(一)
  10. Fastdfs预留空间问题排查分析