c# - 检查焦点是否设置为excel单元格

标签 c# excel vsto vba

我正在从事 VSTO 项目。我需要检测 Excel vsto 项目中的输入焦点。

我想检查焦点是在 excel 单元格上还是在其他 excel 组件上,例如查找对话框、文档操作 Pane 或任何其他 excel 内置对话框。

这有可能被检测到吗?

Please refer screen shot

如截图所示,我想知道输入焦点是否设置为excel单元格?

最佳答案

这将获取事件窗口的标题(vba)

Option Explicit

Private Declare Function GetActiveWindow Lib "User32.dll" () As Long
Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" _
(ByVal hWnd As Long, ByVal lpString As String, ByVal cch As Long) As Long

Function ActiveWindowName()
Dim hWnd As Long
Dim lngRet As Long
Dim strText As String

hWnd = GetActiveWindow()
strText = String(100, Chr(0))
lngRet = GetWindowText(hWnd, strText, 100)
ActiveWindowName=strText
End Function

它将返回事件窗口的标题,但我假设 100 个字符的长度就足够了。

此代码应提供一个返回当前标题并正确调整长度的函数。 (我目前没有安装 c#,所以无法测试):

[DllImport("user32.dll")]
static extern IntPtr GetActiveWindow();

[DllImport("user32.dll", SetLastError=true, CharSet=CharSet.Auto)]
static extern int GetWindowTextLength(IntPtr hWnd);

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString, int nMaxCount);

public static string GetActiveWindowText()
{
    IntPtr hWnd = GetActiveWindow();  
    // Allocate correct string length first
    int length = GetWindowTextLength(hWnd);
    StringBuilder sb = new StringBuilder(length + 1);
    GetWindowText(hWnd, sb, sb.Capacity);
    return sb.ToString();
}

然后您应该能够测试该字符串以查看它包含的内容。在 VBA 示例中,在 A1 中输入 =ActiveWindowName() 会返回 Microsoft Excel - Book1

关于c# - 检查焦点是否设置为excel单元格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14021665/

相关文章:

c# - 动画 gif 编码器错误

excel - 使用 Excel 进行 GROUP BY 并查找日期 WHERE MAX

charts - 使用VBA将多个数据系列添加到Excel图表

excel - 输入框避免空白条目

c# - 在 VSTO 和 WPF 应用程序中未调用 SystemEvents.PowerModeChanged 事件处理程序

c# - 创建 Regex 表达式时遇到问题

c# - 具有持久身份验证的 Azure 移动服务

c# - 菜单的键盘顺序快捷方式

c# - 如何以编程方式从 C# 使用 Word 的 "Compare and Merge Documents..."功能?

.net - 如何解决 VSTO 插件无法加载的问题?