如何阅读子窗口

时间:2014-01-15 06:27:45

标签: c# winforms winapi

我正在使用此代码来读取应用程序的子窗口

  //Parent Intptr = MainWindow();  ///Caption of main window = "Terminal"

    public void GetWindows(IntPtr ParentWindowHandle)
    {
        string str = "SysListView32";
        string str2 = "";
        ParentWindowHandle = functions.FindWindowEx(ParentWindowHandle, (IntPtr)(0), ref str, ref str2);
        IntPtr[] ptrArray2 = new IntPtr[11];
        int i = 0;
        IntPtr window = functions.GetWindow(ParentWindowHandle, 5);
        while (!window.Equals(IntPtr.Zero))
        {
            str = "SysListView32";
            str2 = "";
            ptrArray2[i] = functions.FindWindowEx(window, ptrArray2[i], ref str, ref str2);
            int len = functions.SendMessage(window, 14, IntPtr.Zero, IntPtr.Zero);
            if (len > 0)
            {
                len++;
                StringBuilder lParam = new StringBuilder(len);
                functions.SendMessage(window, 13, (IntPtr)len, lParam);
                cmb_profile.Items.Add(lParam.ToString());
            }
            window = functions.GetWindow(window, 2);
            i++;
        }
    }

我正在获取Windows

A)GBPUSD,H4
B)GBPUSD,H1
C)英镑兑美元,报。

但我没有得到市场观察:16:24:53。

后来我把Caption Market Watch:16:24:53作为Parent IntPtr,但我没有得到任何子窗口。

我想读取符号,Bid,Ask Columns和列表内容,因为它每秒更新一次,我想将速率存储在数据库文件中。

如果有人能帮助我,我们将非常感激。

提前致谢。

1 个答案:

答案 0 :(得分:2)

首先,为了弄清楚这一点,你必须声明一些消息常量,以避免在代码中使用魔术常量。

您计划的下一步,阅读列表视图内容,使用您当前的策略是很棘手的。您需要使用LVM_GETITEMTEXT来读取内容。但是这需要您将指针传递给LVITEM结构。并且踢球者必须在目标进程的地址空间中分配结构。这需要使用以下API:OpenProcess,VirtualAllocEx,WriteProcessMemory,ReadProcessMemory。

这种技术是可行的,并且已知可行。有无数的例子可以在网络搜索中找到。但是,细节非常棘手,特别是如果您不是专家Win32程序员。将它与C#中低级编程的尴尬相结合,你就会有错误的方法。

还有另一个更好的方法:UIAutomation。