2012-12-24 43 views
7

पर सेट है या नहीं, मैं वीएसटीओ प्रोजेक्ट पर काम कर रहा हूं। मुझे एक्सेल vsto प्रोजेक्ट में इनपुट फ़ोकस का पता लगाने की आवश्यकता है।यह जांच कर रहा है कि फोकस एक्सेल सेल

मैं यह जांचना चाहता हूं कि फ़ोकस एक्सेल सेल पर है या नहीं, यह अन्य एक्सेल घटक पर है जैसे संवाद, दस्तावेज़ क्रिया फलक या किसी अन्य एक्सेल अंतर्निहित संवाद।

क्या यह पता लगाना संभव है?

Please refer screen shot

के रूप में स्क्रीन शॉट में दिखाया गया है, मुझे पता है कि इनपुट फ़ोकस या सेल उत्कृष्टता प्राप्त करने के लिए सेट नहीं है कि क्या करना चाहते हैं?

+2

क्या मैं पूछ सकता हूं कि आपको ऐसा करने की आवश्यकता क्यों है? – JMK

+0

@ जेएमके मैं एक्सेल सेल पर इनपुट फोकस नहीं होने पर निष्पादित करने के लिए अपने पेस्ट विशेष कोड को प्रतिबंधित करना चाहता हूं। –

+2

शायद 'Excel.Worksheet.ActiveCell = null' या' Excel.ActiveCell = null'। – RoadBump

उत्तर

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 अक्षरों की लंबाई पर्याप्त होगी।

इस कोड को एक ऐसा फ़ंक्शन देना चाहिए जो वर्तमान शीर्षक लौटाता है, और लंबाई के लिए सही ढंग से समायोजित करता है। (मैं वर्तमान में ग # स्थापित नहीं है, इसलिए मैं इस परीक्षण नहीं कर सकते):

[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 hWind = GetActiveWindow(); 
    // Allocate correct string length first 
    int length = GetWindowTextLength(hWnd); 
    StringBuilder sb = new StringBuilder(length + 1); 
    GetWindowText(hWnd, sb, sb.Capacity); 
    return sb.ToString(); 
} 

फिर आप स्ट्रिंग परीक्षण करने के लिए देखने के लिए इसमें क्या है सक्षम होना चाहिए। वीबीए उदाहरण में, =ActiveWindowName() में ए 1Microsoft Excel - Book1

+1

आपके सी # कोड में लाइन 'intPtr hWind = GetActiveWindow();' 'IntPtr hWnd = GetActiveWindow();' लेकिन अन्यथा मैं होना चाहिए पुष्टि कर सकते हैं कि यह काम करता है। मैंने कोशिश की कुछ संयोजनों के लिए सही विंडो नाम वापस कर दिया। –

+0

ग्रेट उत्तर +1 –

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; 
} 
+0

यह काम नहीं कर रहा है .. :( –

+0

क्या आप कोड डीबग करें और सुनिश्चित करें कि YourExcelApplicationobject ExcelAplication का प्रकार है, यदि आपको अपने कोड –

+0

से अपने एक्सेल एप्लिकेशन को पकड़ने की आवश्यकता नहीं है, तो मेरा एप्लिकेशन ऑब्जेक्ट केवल ExcelAplication का प्रकार है लेकिन यह बात दोनों मामले में है। यदि इनपुट फ़ोकस एक्सेल पर है सेल या 2. इनपुट फोकस दस्तावेज़ एक्शन फलक cmdEdit.Enabled पर है। –