7

私はVSTOプロジェクトに取り組んでいます。Excelvstoプロジェクトで入力フォーカスを検出する必要があります。

フォーカスがExcelセルにあるのか、検索ダイアログ、ドキュメントアクションペイン、その他のExcel組み込みダイアログなどの他のExcelコンポーネントにあるのかを確認したいと思います。

これを検出することは可能ですか?

スクリーンショットを参照してください

スクリーンショットにあるように、入力フォーカスがセルよりも優れているかどうかを知りたいですか?

4

2 に答える 2

3

これにより、アクティブなウィンドウ(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

于 2012-12-28T16:54:48.633 に答える
0

あなたはこのようなことをする必要があります:

private bool CheckInputisinExcelCell()
{
    Microsoft.Office.Core.CommandBarControl cmdEdited;
    cmdEdited=YourExcelApplicationobject.CommandBars.FindControl(Microsoft.Office.Core.MsoControlType.msoControlButton, 23, System.Reflection.Missing.Value, System.Reflection.Missing.Value);
    return cmdEdited.Enabled;
}
于 2012-12-24T13:02:15.010 に答える