web-dev-qa-db-ja.com

名前/タイトルでウィンドウハンドルを返す

この問題は解決できません。エラーが発生します:

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

私は多くの異なる方法で試してみましたが、それぞれが失敗しました。前もって感謝します。

14
VixinG

ループ内で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
15
Basic

Ifブロック内でhWndを宣言しているので、その外側のreturnステートメントにはアクセスできません。明確にするために 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;
}
4
Mitch

この問題を解決するオプションとして:

[DllImport("user32.dll")]
private static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

public IntPtr GetHandleWindow(string title)
{
    return FindWindow(null, title);
} 
2
Wizard

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;
}
1
Shiplu Mokaddim

これには数年遅れますが、他の人が述べたように、hWndのスコープはforeachループ内のみです。

ただし、関数で他に何も実行していないと仮定すると、他の人が提供した回答には2つの問題があることに注意してください。

  1. 変数hWndは(returnの変数として)1つの目的のためだけなので、実際には不要です。
  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;
}
0
Richard
#include <windows.h>
#using <System.dll>

using namespace System;
using namespace System::Diagnostics;
using namespace System::ComponentModel;

// get window handle from part of window title
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;
        }
    }
    return hWnd;
}

// get window handle from exact window title
[DllImport("user32.dll")]
private static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

public IntPtr GetHandleWindow(string title)
{
    return FindWindow(null, title);
} 
0
TheMaster Moh