2012-11-08 9 views
5

का उपयोग कर .NET अनुप्रयोग सूची नियंत्रण से आइटम नाम प्राप्त करें तो मूल रूप से मेरे पास यह सॉफ़्टवेयर है जो सूची फ़ॉर्म में डेटा आउटपुट करता है। यहां टिप्पणियों के लिए धन्यवाद, हमने समझा है कि यह संभवतः .NET में लिखा गया है।Winapi या mfc

मैं सूची स्कैन करना चाहता हूं ताकि मैं डेटा पर कुछ एल्गोरिदम कर सकूं।

जासूस ++ का उपयोग करके मुझे पता चला कि इस सूची को "पैनल 2" शीर्षक दिया गया है और मैं इसे संभालने के लिए संभाल सकता हूं (इसकी कक्षा "WindowsForms10.Window.8.app" है) EnumChildWindows का उपयोग कर।

हालांकि मुझे नहीं पता कि सूची में कैसे पहुंचे ताकि मैं इसकी वस्तुओं को पढ़ सकूं। मैंने "पैनल 2" हैंडल पर EnumChildWindows को आजमाया है और उन सभी विंडोज़ के कैप्शन को आउटपुट किया है लेकिन वे सभी खाली हैं।

क्या पैनल 2 actuall सूची हो सकता है? यदि ऐसा है तो क्या मैं इसे अभी (CListCtrl *) पर डाल सकता हूं?

एक्सिस ने टिप्पणियों में उल्लेख किया है कि शायद यह .NET में लिखा गया है, तो http://reflector.red-gate.com/download.aspx?TreatAsUpdate=1 जैसे कुछ का उपयोग करके नियंत्रण आईडी/हैंडल को प्राप्त करना संभव हो सकता है?

CWnd* mainWindow; 
    CWnd* panel; 
    CListCtrl* list; 



BOOL CALLBACK findWindow(HWND hwnd,LPARAM lParam) 
{ 
    char text[8]; 
    GetWindowText(hwnd,text,8); 

    if(strcmp(text,"Fetcher") == 0) 
    { 
     mainWindow= CWnd::FromHandle(hwnd); 

     return false; 
    } 

    return true; 
} 

BOOL CALLBACK findPanel(HWND hwnd,LPARAM lParam) 
{ 

    char text[7]; 
    GetWindowText(hwnd,text,7); 

    if(strcmp(text,"Panel2") == 0) 
    { 
     panel = CWnd::FromHandle(hwnd); 

     return false; 
    } 

    return true; 
} 


void CAnalyzeDlg::OnBnClickedButton1() 
{ 
    mainWindow = 0; 

    while(mainWindow == 0) 
    { 
    ::EnumWindows(findWindow,0); 
    } 

    mainWindow ->ActivateTopParent(); 

    while(panel == 0) ::EnumChildWindows(mainWindow ->m_hWnd,findPanel,0); 

    CWnd* pointTest = NULL; 

    CString text = ""; 

    int xx = 337; 
    int yy = 95; 

    while(yy < 1024 && (pointTest == NULL || strcmp(text,"") == 0 || strcmp(text,"Panel2") == 0)) 
    { 
     pointTest = mainWindow->ChildWindowFromPoint(CPoint(xx,yy)); 
     yy++; 
     if(pointTest != 0) 
      pointTest->GetWindowTextA(text); 
    } 



    if(strcmp(text,"") != 0) 
     MessageBox(0,text,0); // This never shows 

} 
+0

क्या आपके पास पैनल 2 का हैंडलर है? जैसा कि मैंने कहा – besworland

+0

। हाँ। – David

+1

सबसे पहले, ऐसा लगता है कि आपका ऐप .NET में लिखा गया है (क्लास नाम में "विंडोजफॉर्म" का कारण)। दूसरा - इसे विंडो हैंडल प्राप्त करने के लिए, आपको 'FindWindow' या' FindWindowEx' 'कॉल करना चाहिए, और केवल उस कॉल के बाद' EnumChildWindows'। क्षमा करें अगर मैं असहाय सवाल समझता हूं। – eraxillan

उत्तर

6

जासूस ++ एक उत्कृष्ट उपकरण है, लेकिन यह नहीं है। पता है। मैं एप्लिकेशन पर UISpy.exe को आजमाने का सुझाव देता हूं और यह देखने के लिए कि यह Spy ++ से अधिक तत्व ढूंढने में सक्षम है। UISpy.exe http://msdn.microsoft.com/en-us/library/ms727247.aspx में पाया जा सकता है और ManagedSpy.exe रूप में अच्छी तरह है http://msdn.microsoft.com/en-us/magazine/cc163617.aspx

आप निश्चित हो सकते है, तो आवेदन यह (या तो दृश्य स्टूडियो या WinDBG को एक डिबगर संलग्न द्वारा एक नेट अनुप्रयोग है या नहीं, मैं डी वीसी ++ के मुफ्त संस्करण की अनुशंसा करते हैं यदि आपके पास पहले से ही विजुअल स्टूडियो नहीं है क्योंकि मुझे यकीन नहीं है कि सी # संस्करण में देशी डिबगिंग समर्थन है)। एक और विकल्प विंडोज प्लेटफ़ॉर्म एसडीके से निर्भर करता है या http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx से प्रोसेसएक्सप्लोरर.एक्सई का उपयोग करना है ताकि यह देखने के लिए कि डीएलएल प्रक्रिया में क्या लोड हो रहा है (यानी .NET ऐप में कोर .NET DLL लोड होगा)।

यदि सूची वास्तव में एक विंडोज प्रेजेंटेशन फॉर्म (डब्ल्यूपीएफ) सूची है तो आपको सूची की सामग्री तक पहुंचने के लिए .NET UIAutomation कक्षाओं का उपयोग करना होगा। UIAutomation यहाँ प्रलेखित है: http://msdn.microsoft.com/en-us/library/ms747327.aspx

संपादित करें: UISpy.exe MSDN डॉक्स के अनुसार अब अप्रचलित है:

नोट सुलभ एक्सप्लोरर और यूआई जासूस उपकरण अप्रचलित और अब उपलब्ध नहीं हैं। डेवलपर्स को इसके बजाय निरीक्षण या AccScope का उपयोग करना चाहिए।

+0

सही दिशा में मुझे इंगित करने के लिए धन्यवाद! हालांकि मैं अभी भी डेटा को पकड़ने में असमर्थ हूं। मैं इसे यूआई जासूस के साथ स्पष्ट रूप से देख सकता हूं और मेरे पास सही IUIAutomationElement * है। यहां मेरा नया प्रश्न है (!): http://stackoverflow.com/questions/13433563/get-the-value-of-a-ui-item-from-a-iuiautomationelement-pointer – David

संबंधित मुद्दे