1.別のフォームからすべてのボタンを見つけようとしているアプリケーションがあります。次の 3 つの API 関数を使用しています。
[DllImport("user32.dll", SetLastError = true)]
public static extern IntPtr FindWindowEx(IntPtr parentHandle, IntPtr childAfter, string className, string windowTitle);
[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
[DllImport("user32.dll")]
static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam);
私のプログラムでは、確認したいアプリケーションが実行されているかどうかを確認し、実行されている場合は次のことを行います。
Process[] uWebCam = Process.GetProcessesByName("asd.vshost");
if (uWebCam.Length != 0)
{
IntPtr ptr = uWebCam[0].MainWindowHandle;
IntPtr x = FindWindowByIndex(ptr, 0);
const int BM_CLICK = 0x00F5;
SendMessage(x, BM_CLICK, IntPtr.Zero, IntPtr.Zero);
}
そして、これはインデックス(0、1、...)でボタンを見つけようとしている関数です:
static IntPtr FindWindowByIndex(IntPtr hWndParent, int index)
{
if (index == 0)
return hWndParent;
else
{
int ct = 0;
IntPtr result = IntPtr.Zero;
do
{
result = FindWindowEx(hWndParent, result, "Button", null);
if (result != IntPtr.Zero)
++ct;
}
while (ct < index && result != IntPtr.Zero);
return result;
}
}
しかし、プログラムは別のフォームの最初のボタン ( index 0 button ) を押しません。
2.実行中のプロセスからすべてのボタン名を見つけることができるプログラムはありますか? Spy++ を試しましたが、有用なものは見つかりませんでした...