获取Excel输入框方法的hwnd

2024-03-01

我想我有一个相当简单的问题。我正在寻找一种获取 Excel 输入框的 hwnd 的方法。我正在自动化一个流程,我注意到 8 类输入框始终位于 Excel 窗口下方(我正在从另一个应用程序自动化 Excel,如果这有帮助的话)。显然,我希望它显示在顶部,并且我正在尝试使用 SetForegroundWindow 函数。有什么建议吗?

根据要求,我发现唯一值得尝试的事情:

Public Function GetHwnd() as Long
     GetHwnd = Excel.Application.InputBox.hwnd
End Function

这不是一个简单的问题 - 答案解决了 VBA 中几个令人沮丧的漏洞。

VBA.InputBox 函数创建一个“模态对话框”,在您需要 VBA 获取窗口句柄并调用某些或其他 API 函数时,该对话框使应用程序的 VBA 代码处于等待状态。

当“模态”状态被释放、允许 VBA 再次运行命令和 API 函数时,InputBox 已经消失。

幸运的是,“manish1239”于 2003 年 10 月发现了一种解决方法,他在Xtreme Visual Basic 讲座 http://www.xtremevbtalk.com/archive/index.php/t-112708.html:他将您需要运行的代码放入 VBA 函数中,该函数使用来自 API 计时器的延迟回调围绕该等待状态运行。

我使用他的代码在 VBA InputBox 中设置“PasswordChars”:这是一个需要 InputBox 窗口句柄的 API 调用,您可以根据需要调整代码



Public Function InputBoxPassword(Prompt As String, _
                                 Optional Default As String = vbNullString, _
                                 Optional XPos, Optional YPos, _
                                 Optional HelpFile, Optional HelpContext _
                                 ) As String
On Error Resume Next  

' 复制 VBA InputBox 函数的功能,并使用用户的 ' 键入的输入显示为星号。对话框的“标题”参数 ' 在此实现中,标题被硬编码为“需要密码”。

' 必需函数:TimerProcInputBox ' 必需的 API 声明:FindWindow、FindWindowEx、SetTimer、KillTimer

” 奈杰尔·赫弗南,2015 年 1 月,

' **** **** **** *** 此代码属于公共领域 **** **** **** ****

' 基于用户 'manish1239' 在 Xtreme Visual Basic Talk 中发布的代码 ” 2003 年 10 月http://www.xtremevbtalk.com/archive/index.php/t-112708.html http://www.xtremevbtalk.com/archive/index.php/t-112708.html

' 编码注释:我们将 'Set PasswordChar' 消息发送到文本框编辑 ' VBA“InputBox”对话框中的窗口。这不是一个简单的任务: ' InputBox 是同步的,是一个“模态对话框”,它使我们的应用程序 ' 在我们需要调用 Send 的同时,VBA 代码处于等待状态 '消息API函数。因此它通过 API 计时器的延迟回调来运行

' 警告:网上发布的许多 64 位 API 声明都是不正确的 ' 和none其中对于指针安全定时器 API 函数来说是正确的。

出错时继续下一步

SetTimer 0&, 0&, 10&, TimerProcInputBox 的地址

输入框密码 = 输入框(提示, _ PASSBOX_INPUT_CAPTION, _ 默认, _ XPos、YPos、_ 帮助文件、帮助上下文)

结束功能

#If VBA7 And Win64 then '64位Windows下的64位Excel'使用LongLong和LongPtr ' 请注意,wMsg 始终是 WM_TIMER 消息,适合长整型 Public Sub TimerProcInputBox(ByVal hwnd As LongPtr, _ ByVal wMsg 只要,_ ByValid idEvent As LongPtr, _ ByVal dwTime As LongLong) 出错时继续下一步

' REQUIRED for Function InputBoxPassword
' https://msdn.microsoft.com/en-US/library/windows/desktop/ms644907(v=vs.85).aspx

KillTimer hWndIbox, idEvent

Dim hWndIbox As LongPtr   ' Handle to VBA InputBox

hWndIbox = FindWindowEx(FindWindow("#32770", PASSBOX_INPUT_CAPTION), 0, "Edit", "")

If hWndIbox <> 0 Then
    SendMessage hWndIbox, EM_SETPASSWORDCHAR, Asc("*"), 0&
End If

End Sub

#ElseIf VBA7 那么“32 位 Office 中的 VBA7”仅使用 LongPtr

Public Sub TimerProcInputBox(ByVal hwnd As LongPtr, _
                             ByVal wMsg As Long, _
                             ByVal idEvent As LongPtr, _
                             ByVal dwTime As Long)
On Error Resume Next

' REQUIRED for Function InputBoxPassword
' https://msdn.microsoft.com/en-US/library/windows/desktop/ms644907(v=vs.85).aspx

Dim hWndIbox As LongPtr    ' Handle to VBA InputBox

KillTimer hwnd, idEvent

hWndIbox = FindWindowEx(FindWindow("#32770", PASSBOX_INPUT_CAPTION), 0, "Edit", "")


If hWndIbox <> 0 Then
    SendMessage hWndIbox, EM_SETPASSWORDCHAR, Asc("*"), 0&
End If


End Sub

#Else ' 32 位 Excel

Public Sub TimerProcInputBox(ByVal hwnd As Long, _
                             ByVal wMsg As Long, _
                             ByVal idEvent As Long, _
                             ByVal dwTime As Long)
On Error Resume Next

' REQUIRED for Function InputBoxPassword
' https://msdn.microsoft.com/en-US/library/windows/desktop/ms644907(v=vs.85).aspx

Dim hWndIbox As Long    ' Handle to VBA InputBox

KillTimer hwnd, idEvent

hWndIbox = FindWindowEx(FindWindow("#32770", PASSBOX_INPUT_CAPTION), 0&, "Edit", "")

If hWndIbox <> 0 Then
    SendMessage hWndIbox, EM_SETPASSWORDCHAR, Asc("*"), 0&
End If


End Sub

#End If

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

获取Excel输入框方法的hwnd 的相关文章

  • 如何在Excel VBA中获取给定模块名称的函数和子列表

    我正在开发一个帮助宏 它可以查看活动 Excel 工作簿上给定模块名称的列表函数 例如 我有一个模块名称 Module1 该模块内部有以下功能或子功能 Sub Sub1 End Sub Sub Sub2 End Sub Function F
  • 使用 VBA 设置 Sharepoint 标签/属性

    是否可以使用 VBA 设置 Sharepoint 文档 特别是 Excel 的标签 目前我知道处理此问题的唯一方法是将文件保存到 Sharepoint 在出现提示时设置标签 然后再次下载该文件并将其用作模板 然而 我需要使用这些标签的几种不
  • 防止 Excel 公式中的单元格数量增加

    我在 Excel 中有一个公式 需要根据该行中的数字除以一个常数对该列的几行运行 当我复制该公式并将其应用于范围中的每个单元格时 所有单元格编号都会随行增加 包括常量 所以 B1 127 C4 IF B4 lt gt B4 B1 如果我复制
  • Rails 4/5 发送动态 ActionMailer::Base.mail 电子邮件,附件标记为 Noname

    我看过类似的帖子 主要涉及通过创建视图和控制器来发送附件 例如 电子邮件中的 PDF 附件称为 Noname https stackoverflow com questions 12816042 pdf attachment in emai
  • 在 Objective-C (iPhone) 中从 Excel 文件读取数据 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我在 google 中搜索过 但似乎没有找到从 Objective C 读取 Excel 文件的方法 我找到的唯一答案是首先转换为 CSV
  • VBA 窗体最多可以容纳多少个控件?

    我目前正在构建一个 Excel 2003 应用程序 该应用程序需要非常复杂的表单 并且担心控件数量的限制 目前它有 154 个控件 使用Me Controls Count 这应该是准确的 对吧 但可能只完成了大约三分之一 工作流程确实适合单
  • 创建另一个进程的 HWND 的子窗口? (例如屏幕保护程序预览)

    我正在用 Java 编写一个屏幕保护程序 它主要适用于 Windows 但我更希望它尽可能便携且实用 根据http support microsoft com kb 182383 http support microsoft com kb
  • VBA中工作表变化的递归调用

    我已经创建了包含多个工作表的工作簿 我正在尝试使用 WorkSheet ChangeSheet1 即工作表 1 上的某些更改正在复制到工作表 2 中 同样 如果有任何改变Sheet2我想做出类似的改变Sheet1以及 这样做时 两张表上都会
  • 在 C# 中更改 Excel 单元格格式

    如何使用 C 中的 Microsoft Excel 12 0 库更改 Excel 中单元格的格式 更具体地说 我想将给定单元格更改为文本格式 我读过了 net c 改变Excel单元格格式 https stackoverflow com q
  • 带有 For 循环的多维数组 VBA

    尝试检查第一列中的值 即多维数组中的列 如果它匹配 则对另一列中与该行匹配的值进行排序 我认为我做错了 但这是我第一次搞乱多维数组 我是否需要在每个 for 循环中使用 UBound 和 LBound 来告诉它要查看哪一列 除了当前问题的答
  • 使用 C# 在 Powerpoint 2013 中创建具有多个系列的图表

    我使用的是 VS2013 Ultimate 带有 Office 2013 已安装 PowerPoint Excel 和 Word 我正在用 C 编码 我正在使用 C 创建 PowerPoint 演示文稿 到目前为止 我已经成功地完成了我想做
  • 在 Excel 2010 中添加基本功能区的 VBA 代码?

    我已经使用产品在 C addin express 中为 Excel 编写功能区 但我需要知道如何使用 vba 生成功能区 有人能为我提供一些代码来为此在工具栏中插入一个额外的功能区吗 我所说的功能区是指上面写着 公式 数据 评论 等的地方
  • 在 EXCEL 中使用多个表的条件求和

    我有一个表 我试图根据两个参考表的值来填充该表 我有各种不同的项目 类型 1 类型 2 等 每个项目运行 4 个月 并且根据其生命周期的不同时间 花费不同的金额 这些成本计算显示在Ref Table 1 参考表1 Month a b c d
  • 将图表导出为图像 - 只需单击按钮

    我正在尝试创建一个按钮 将 图表 工作表中的图表导出为 jpeg 文件 这是我的代码 但它不断显示此错误 运行时错误 424 需要对象 具体来说 Set myChart Graphs ChartObjects 3 Name Chart4 这
  • Word VBA“项目不可见”

    有谁知道如何使模板在 Word 2007 中可见 我创建了一个模板 Experiments dotm 使用加载项添加它 但是当我尝试在其中创建模块时 收到错误消息 项目无法查看 关于 项目无法查看 问题的解释可以参见here http ms
  • 更改使用 ClosedXML 显示的工作表

    我正在使用 ClosedXML 动态创建包含多个工作表的 Excel 工作簿 生成内容后 我正在努力将所选工作表更改回工作簿中的第一个工作表 并且在文档中找不到有关如何更改显示的工作表的任何内容 我努力了 wb Worksheet 1 Se
  • 如何刷新幻灯片放映中的活动幻灯片?

    基于我的最后一个问题 https stackoverflow com questions 14503054 change the image of an image shape我得到了正确的代码来更改形状的图像 不幸的是 这不会更新活动演示
  • excel中的多轴折线图

    我正在寻找类似于下图中的多轴折线图 这是由 amcharts 制作的 JavaScript 图表 excel有没有可以绘制图表的选项 请注意 有 3 个 Y 轴和 3 个折线图 可让您比较数据 是否有可能获得超过 3 个数据点 每个数据点在
  • 如何将包含 5000 条记录的 Excel 文件插入到 documentDB 中?

    我有一个 Excel 文件 最初约有 200 行 我能够将 Excel 文件转换为数据表 并且所有内容都正确插入到 documentdb 中 Excel 文件现在有 5000 行 在插入 30 40 条记录后不会插入 其余所有行不会插入到
  • 为什么 Excel 有时会在工作表名称中添加 $?

    我有时但并非总是发现 Excel 会放置一个 位于工作表名称末尾 但在 Excel 中看不到 只有在尝试使用 C 将其导入 SQL Server 时才可见 我遇到过很多不同的情况 它保留了原始工作表 但也创建了第二个空的 隐藏 工作表 其中

随机推荐