2012-11-25 10 views
8

द्वारा मैं इस समस्या को हल नहीं कर सकता।रिटर्न विंडो हैंडल इसके नाम/शीर्षक

The name 'hWnd' does not exist in the current context 

यह बहुत आसान लगता है और शायद ... इसलिए स्पष्ट सवाल पूछ लिए खेद है: मैं कोई त्रुटि मिलती है।

public static IntPtr WinGetHandle(string wName) 
    { 
     foreach (Process pList in Process.GetProcesses()) 
     { 
      if (pList.MainWindowTitle.Contains(wName)) 
      { 
       IntPtr hWnd = pList.MainWindowHandle; 
      } 
     } 
     return hWnd; 
    } 

मैं कई अलग अलग तरीकों के साथ की कोशिश की और प्रत्येक में विफल रहता है:

यहाँ मेरी कोड है। अग्रिम धन्यवाद।

उत्तर

11

मत भूलना आप पाश अंदर आप hWnd घोषणा कर रहे हैं - जो यह पाश अंदर ही दिखाई है का मतलब है। क्या होता है यदि विंडो शीर्षक मौजूद नहीं है? यदि आप एक for साथ यह करने के लिए चाहते हैं, तो आप अपने पाश के बाहर यह घोषणा, पाश अंदर यह सेट तो इसे वापस चाहिए ...

IntPtr hWnd = IntPtr.Zero; 
    foreach (Process pList in Process.GetProcesses()) 
    { 
     if (pList.MainWindowTitle.Contains(wName)) 
     { 
      hWnd = pList.MainWindowHandle; 
     } 
    } 
    return hWnd; //Should contain the handle but may be zero if the title doesn't match 
+0

मैं इसे पहले घोषित करने की कोशिश की ** ** foreach और मुझे 'वापसी एचडब्ल्यूएनडी' लाइन में असाइन किए गए स्थानीय चर 'एचडब्ल्यूएनडी' का उपयोग मिला, यही कारण है कि मैंने यहां पूछा। – VixinG

+0

फिर आपको इसे 'IntPtr.Zero'' में शुरू करना चाहिए (मेरा संपादन देखें)। ऐसा इसलिए है क्योंकि विंडो शीर्षक का मिलान नहीं किया जा रहा है - इसलिए आप कभी भी वेरिएबल सेट नहीं कर रहे हैं जो अपरिभाषित सामग्री के साथ स्मृति के क्षेत्र को इंगित करता है। – Basic

+0

मैं देख रहा हूँ, यह 'होना चाहिए IntPtr hwnd = IntPtr.Zero;' :) – VixinG

1

hWndforeach लूप में घोषित किया गया है। इसका संदर्भ foeach लूप के अंदर है। इसके मूल्य को foreach लूप के बाहर घोषित करने के लिए।

उपयोग इसे इस तरह,

public static IntPtr WinGetHandle(string wName){ 
    IntPtr hWnd = NULL; 

    foreach (Process pList in Process.GetProcesses()) 
     if (pList.MainWindowTitle.Contains(wName)) 
      hWnd = pList.MainWindowHandle; 

    return hWnd; 
} 
3

क्योंकि आप अगर ब्लॉक के अंदर hWnd की घोषणा कर रहे हैं, यह करने के लिए दुर्गम है रिटर्न स्टेटमेंट जो इसके बाहर है। स्पष्टीकरण के लिए http://www.blackwasp.co.uk/CSharpVariableScopes.aspx देखें।

कोड hWnd चर की घोषणा को ले जाकर आप ठीक किया जा सकता प्रदान की है:

public static IntPtr WinGetHandle(string wName) 
{ 
    IntPtr hwnd = IntPtr.Zero; 
    foreach (Process pList in Process.GetProcesses()) 
    { 
     if (pList.MainWindowTitle.Contains(wName)) 
     { 
      hWnd = pList.MainWindowHandle; 
     } 
    } 
    return hWnd; 
} 
+0

धन्यवाद, दोनों लोग, 'IntPtr.Zero' सब कुछ हल किया – VixinG

0

यह करने के लिए देर से कई साल आ रहा है लेकिन, के रूप में दूसरों का उल्लेख किया है, hWnd के दायरे में ही है foreach पाश।

  1. चर hWnd है वास्तव में अनावश्यक है, क्योंकि यह केवल के लिए किया जा रहा है:

    लेकिन यह ध्यान देने योग्य है कि यह मानकर कि आप समारोह के साथ और कुछ नहीं कर रहे हैं, तो जवाब दूसरों की व्यवस्था की है के साथ दो मुद्दे हैं एक बात (return के लिए चर के रूप में)

  2. foreach लूप अक्षम है, यहां तक ​​कि एक मैच मिलने के बाद भी, आप बाकी प्रक्रियाओं को खोजना जारी रखते हैं। वास्तव में, यह उस अंतिम प्रक्रिया को वापस कर देगा जो इसे मेल खाता है।

यह मानते हुए कि आप पिछले प्रक्रिया से मेल नहीं करना चाहते (बिंदु # 2), तो यह एक क्लीनर और अधिक कुशल समारोह है:

public static IntPtr WinGetHandle(string wName) 
{ 
    foreach (Process pList in Process.GetProcesses()) 
     if (pList.MainWindowTitle.Contains(wName)) 
      return pList.MainWindowHandle; 

    return IntPtr.Zero; 
} 
संबंधित मुद्दे