この問題は解決できません。エラーが発生します:
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;
}
私は多くの異なる方法で試してみましたが、それぞれが失敗しました。前もって感謝します。
ループ内で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
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;
}
この問題を解決するオプションとして:
[DllImport("user32.dll")]
private static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
public IntPtr GetHandleWindow(string title)
{
return FindWindow(null, title);
}
hWnd
はforeach
ループで宣言されています。 そのコンテキストは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;
}
これには数年遅れますが、他の人が述べたように、hWnd
のスコープはforeach
ループ内のみです。
ただし、関数で他に何も実行していないと仮定すると、他の人が提供した回答には2つの問題があることに注意してください。
hWnd
は(return
の変数として)1つの目的のためだけなので、実際には不要です。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;
}
#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);
}