从其他进程访问元素

时间:2012-04-12 17:52:47

标签: c# interprocess

我想从与我的程序无关的窗口“读取”信息。 如果我有进程ID和窗口句柄:

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

我从spy ++获得的信息告诉我,我感兴趣的元素的控件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个字节,但获得实际大小会更好......

就编码而言,不同的编码可能更适合您的需求。

Hex中的句柄需要转换为整数:Convert.ToInt32("0x000003EA", 16)

GetDlgItemText 最适合(我认为)我需要获取静态文本而不是“ SendMessage ”和“ WM_GETTEXT

感谢所有帮助我指明正确方向的人!

GetDlgItemText的来源:MSDN

编辑_________________________________

嗯。我说得太快了......每次启动程序时都会更改元素ID。我在Persistent Element Identification打开了一个新问题。

3 个答案:

答案 0 :(得分:1)

最好的选择是UI Automation

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

另外看看我的this answer,类似的问题,可能有助于能够访问/“附加”到其他进程线程/队列等。

编辑:(我忘了把我的另一篇文章链接起来,刚才更正了:)

答案 1 :(得分:0)

WCF,Web服务可以轻松实现进程间通信。

答案 2 :(得分:0)

我会调查这样的事情 Managed Spy ++

这也可以帮助Find Window in C#