我正在使用此代码来读取应用程序的子窗口
//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和列表内容,因为它每秒更新一次,我想将速率存储在数据库文件中。
如果有人能帮助我,我们将非常感激。
提前致谢。
答案 0 :(得分:2)
首先,为了弄清楚这一点,你必须声明一些消息常量,以避免在代码中使用魔术常量。
您计划的下一步,阅读列表视图内容,使用您当前的策略是很棘手的。您需要使用LVM_GETITEMTEXT来读取内容。但是这需要您将指针传递给LVITEM结构。并且踢球者必须在目标进程的地址空间中分配结构。这需要使用以下API:OpenProcess,VirtualAllocEx,WriteProcessMemory,ReadProcessMemory。
这种技术是可行的,并且已知可行。有无数的例子可以在网络搜索中找到。但是,细节非常棘手,特别是如果您不是专家Win32程序员。将它与C#中低级编程的尴尬相结合,你就会有错误的方法。
还有另一个更好的方法:UIAutomation。