我正在尝试将SendMessage用于记事本,这样我就可以插入书面文本而不会将记事本作为活动窗口.
我在过去使用过这样的事情SendText,但这需要给予Notepad专注.
现在,首先我要检索Windows句柄:
Process[] processes = Process.GetProcessesByName("notepad");
Console.WriteLine(processes[0].MainWindowHandle.ToString());
Run Code Online (Sandbox Code Playgroud)
我已经确认它是记事本的正确句柄,内部显示相同Windows Task Manager.
[DllImport("User32.dll", EntryPoint = "SendMessage")]
public static extern int SendMessage(int hWnd, int Msg, int wParam, int lParam);
Run Code Online (Sandbox Code Playgroud)
从这里开始,我无法让SendMessage在我的所有实验中工作.我走错了方向吗?
我创建一个IEnumerable对象,它只包含我想要的节点来自xml文件:
IEnumerable<XElement> rosters = XDocument.Load("roster.xml")
.Elements("rosterlist")
.Elements("roster")
.Where(w => w.Element("division")
.Value
.Equals("SUPER AWESOME DIVISION"));
Run Code Online (Sandbox Code Playgroud)
所以它是这些的集合:
<rosterlist>
<roster>
<userid>1</userid>
<name></name>
<etc></etc>
</roster>
<roster>
<userid>2</userid>
<name></name>
<etc></etc>
</roster>
</rosterlist>
Run Code Online (Sandbox Code Playgroud)
我想只抓取userid属性也是集合中userid节点的用户rosters.
IEnumerable<XElement> users = XDocument.Load("user.xml")
.Elements("userlist")
.Elements("user")
.Where(w => rosters.Elements("userid")
.Contains(w.Attribute("userid").Value));
Run Code Online (Sandbox Code Playgroud)
但它给了我一个错误:
无法从用法推断出方法'System.Linq.Enumerable.Contains(System.Collections.Generic.IEnumerable,TSource)'的类型参数.尝试显式指定类型参数.
我的做法有什么问题?
在上一个问题中,我询问了如何将文本发送到记事本.它帮了我很大的忙.对于第2部分,这是相同应用的mIRC的简化版本:
[DllImport("User32.dll", EntryPoint = "FindWindow")]
public static extern IntPtr FindWindow(String lpClassName, String lpWindowName);
[DllImport("user32.dll", EntryPoint = "FindWindowEx")]
public static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);
[DllImport("User32.dll")]
public static extern int SendMessage(IntPtr hWnd, int uMsg, int wParam, string lParam);
IntPtr mainHandle = FindWindow("mIRC", null);
IntPtr serverHandle = FindWindowEx(mainHandle, new IntPtr(0), "MDIClient", null);
IntPtr chanHandle = FindWindowEx(serverHandle, new IntPtr(0), "mIRC_Channel", null);
IntPtr editHandle = FindWindowEx(chanHandle, new IntPtr(0), "Edit", null);
SendMessage(editHandle, 0x000C, 0, textBox1.Text);
Run Code Online (Sandbox Code Playgroud)
这似乎对我来说是正确的,除了它不起作用!是否窗口名称不正确(MDIClient,mIRC_Channel和Edit)?这些是我通过Google搜索"FindWindowEx mIRC"在网站上找到的值.
1.)我在上面做错了什么? …