あなたはそのプロセスのすべてのウィンドウのハンドルを列挙開始する必要があります:
https://stackoverflow.com/a/2584672/351383
次に、各取り扱いのためのテキストと位置に関する情報を取得し、位置INFOMATIONであなたが得るために、その位置にデスクトップのスクリーンショットを取ることができます画像AFAIKは、実行中のアプリケーションのウィンドウから画像を取得する他の方法はありません。
:あなたがコントロールの画面位置を得たとき
その後、いくつかのテキストのために、マウスの左クリックをシミュレートするために、下記のリンクから、検索ウィンドウを使用して、コントロール内のいくつかのポイントをクリックして、ここでのポイントをクリックします方法であり、
https://stackoverflow.com/a/10355905/351383
私は、プロセスのためにそのデータを収集するために迅速なクラスtoghether置く:その後、ノーあり
public static class ProcessSpy
{
public static List<ProcessSpyData> GetDataForProcess(string processName)
{
var result = new List<ProcessSpyData>();
Process myProc = Process.GetProcessesByName(processName).FirstOrDefault();
if (myProc != null)
{
var myHandles = EnumerateProcessWindowHandles(myProc);
foreach (IntPtr wndHandle in myHandles)
{
result.Add(new ProcessSpyData(wndHandle));
}
}
return result;
}
delegate bool EnumThreadDelegate(IntPtr hWnd, IntPtr lParam);
[DllImport("user32.dll")]
static extern bool EnumThreadWindows(int dwThreadId, EnumThreadDelegate lpfn, IntPtr lParam);
static IEnumerable<IntPtr> EnumerateProcessWindowHandles(Process prc)
{
var handles = new List<IntPtr>();
foreach (ProcessThread thread in prc.Threads)
EnumThreadWindows(thread.Id, (hWnd, lParam) => { handles.Add(hWnd); return true; }, IntPtr.Zero);
return handles;
}
}
public class ProcessSpyData
{
private const uint WM_GETTEXT = 0x000D;
[DllImport("user32.dll", CharSet = CharSet.Auto)]
static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, int wParam, StringBuilder lParam);
[DllImport("user32.dll")]
private static extern bool GetClientRect(IntPtr hWnd, out RECT lpRect);
[StructLayout(LayoutKind.Sequential)]
private struct RECT
{
int left, top, right, bottom;
public Rectangle ToRectangle()
{
return new Rectangle(left, top, right - left, bottom - top);
}
}
[DllImport("user32.dll")]
static extern bool ClientToScreen(IntPtr hWnd, ref Point lpPoint);
public IntPtr WindowHandle { get; private set; }
public string WindowText { get; private set; }
public Rectangle ClientRect { get; private set; }
public Rectangle ScreenPos { get; private set; }
public ProcessSpyData(IntPtr windowHandle)
{
this.WindowHandle = windowHandle;
GetWindowText();
GetWindowSize();
}
private void GetWindowText()
{
StringBuilder message = new StringBuilder(1024);
SendMessage(this.WindowHandle, WM_GETTEXT, message.Capacity, message);
this.WindowText = message.ToString();
}
private void GetWindowSize()
{
var nativeRect = new RECT();
GetClientRect(this.WindowHandle, out nativeRect);
this.ClientRect = nativeRect.ToRectangle();
Point loc = this.ClientRect.Location;
ClientToScreen(this.WindowHandle, ref loc);
this.ScreenPos = new Rectangle(loc, this.ClientRect.Size);
}
}
あなたが始める必要があることが、アプリが非標準コントロールを使用している場合は注意する必要がありこの方法でテキストを取り出す方法と、画像の場合は、実行可能なリソースを見てより良い結果が得られるかもしれません。各種制御タイプのため
UPDATE
Getingコントロールのテキスト(MFC、WinFormsのは、デルファイVCLなど)は非常に難しい作業になるだろうが、リサイズが優秀Managed Windows APIを見るために、彼らも、スパイアプリケーションのいくつかの並べ替えでを持っていますtools、それを見てください。
TExtboxes \ picturesまた、ボタンをクリックすることにしました。どのくらい正確に私はWindowsのメッセージを聞く必要がありますか? – user194076
この記事を見て:http://stackoverflow.com/questions/9665579/setting-up-hook-on-windows-messagesそしてspy ++で遊んでみてください(http://technet.microsoft.com/en- us/library/dd460725.aspx) – animaonline