访问其他进程元素(Accessing Elements from Other Processes)

2019-09-26 14:29发布

我想从没有涉及到我的程序窗口,以“读”的信息。 如果我有一个进程ID和一个窗口句柄:

Process Proc = Process.GetProcessById(ProcID);
IntPtr hdl = Proc.MainWindowHandle;

而我从谍照信息++告诉我,控制ID我感兴趣的是00000003EA元素的,我怎么能与C#访问它?

谢谢你的帮助!

编辑_____________________________________

如果有人有兴趣,我这是怎么得到它的工作:

Process p = Process.GetProcessById(ProcID);
IntPtr hdl = p.MainWindowHandle;
byte[] buffer = new byte[1024]; //Assume that 1024 bytes are enough! Better would be to get the text length..
UTF8Encoding enc = new UTF8Encoding();
uint Test = GetDlgItemText((int)hdl, Convert.ToInt32("0x000003EA", 16), buffer, 1024);
string TextFromOtherWindow = enc.GetString(buffer);

[DllImport("user32.dll")]
public static extern uint GetDlgItemText(
 int hDlg,           //A handle to the dialog box that contains the control. 
 int nIDDlgItem,     //The identifier of the control whose title or text is to be retrieved. 
 byte[] lpString,      //The buffer to receive the title or text. 
 int nMaxCount       //The maximum length, in characters, of the string to be copied to the 
 //buffer pointed to by lpString. If the length of the string, including 
 //the null character, exceeds the limit, the string is truncated. 
);

byte[] buffer是其中来自其他窗口中的文本被写回到缓冲器。 我以为,文字不超过1024字节长,但它会更好地得到实际尺寸...

至于编码推移,所不同的可能是更适合您的需求。

需要在十六进制的句柄被转换为一个整数: Convert.ToInt32("0x000003EA", 16)

GetDlgItemText是最适合的(我觉得)我得到的静态文本,而不是“SendMessage函数 ”和“WM_GETTEXT”的要求。

感谢所有谁帮我指出正确的方向!

来源GetDlgItemText: MSDN

编辑_________________________________

嗯。 我说话太快...元素ID是每个程序启动时间而改变。 我在打开一个新的问题持续元素标识 。

Answer 1:

最好的办法是与去UI自动化 。

虽然这不是完美的,因为许多应用程序不支持这一点。

也看看这个答案我的,类似的问题,可能与能够访问/“附加”到其他进程的线程/队列等帮助

编辑:(我忘了我的其他帖子,只需修正联系起来:)



Answer 2:

WCF,Web服务就在那儿进程间通信方便。



Answer 3:

我会去了解一下这样的托管间谍++

这也可能有助于在C#中查找窗口



文章来源: Accessing Elements from Other Processes