我想从与我的程序无关的窗口“读取”信息。 如果我有进程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打开了一个新问题。
答案 0 :(得分:1)
最好的选择是UI Automation。
虽然这并不完美,因为许多应用程序不支持这一点。
另外看看我的this answer,类似的问题,可能有助于能够访问/“附加”到其他进程线程/队列等。
编辑:(我忘了把我的另一篇文章链接起来,刚才更正了:)答案 1 :(得分:0)
WCF,Web服务可以轻松实现进程间通信。
答案 2 :(得分:0)
我会调查这样的事情 Managed Spy ++
这也可以帮助Find Window in C#