服务器上放置一个我写的小工具:暂停30秒线程反复循环执行 像某个应用程序发送键盘按键信息。( SendKeys.SendWait) 当我远程连接到这个服务器上观看运行这个小工具的时候,一切功能都非常正常;
但当我远程断开(非注销方式),有时最小话远程桌面,发觉这个发送键盘按键信息的线程一直被中断到我下次再次远程连接观看这个程序的时候才继续完成。
真是搞的我非常纳闷不解。各位有何良策啊?
但当我远程断开(非注销方式),有时最小话远程桌面,发觉这个发送键盘按键信息的线程一直被中断到我下次再次远程连接观看这个程序的时候才继续完成。
真是搞的我非常纳闷不解。各位有何良策啊?
给你两个解决方案:
1. 跑到远程电脑上,登录,然后关显示器,走人,记住不要远程登录它
2. 远程连接,永远不要关,也不能最小化
--以上经验总结来自一个做了5年Windows UI Automation的SDET
我仔细看了你的需求,发现原来你只是希望向某个应用程序发送键盘按键信息,这个很容易做。不要用SendKey,用SendMessge,这样就和User Session没关系了。举例:
// 对某个button发送点击消息
SendMessage(hWndButton, BM_CLICK, 0, 0);// 对某个窗口里面ID=25的button发送点击消息(只限目标窗口是C++方式创建的,对.NET的winform无效)
SendDlgItemMessage(hWndDlg, 25, BM_CLICK, 0, 0);
如果还不能满足你的需要,请告诉我你的目标窗口是什么语言开发的程序。
http://im.qq.com/qq/gainian/
http://msdn.microsoft.com/en-us/library/ms644950(VS.85).aspx我写个详细的例子给你using System;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Threading;namespace MyAutomation
{
class Program
{
private const uint BM_CLICK = 0x00F5;
private const uint WM_SETTEXT = 0x000C; // http://msdn.microsoft.com/en-us/library/bb775985(VS.85).aspx
[DllImport("user32", EntryPoint = "SendDlgItemMessageW")]
private static extern int ClickButton(IntPtr hWnd, int nIDDlgItem, uint Msg = BM_CLICK, int wParam = 0, int lParam = 0); // http://msdn.microsoft.com/en-us/library/ms632644(VS.85).aspx
[DllImport("user32", EntryPoint = "SendDlgItemMessageW")]
private static extern int SetText(IntPtr hWnd, int nIDDlgItem, uint Msg = WM_SETTEXT, int wParam = 0, [MarshalAs(UnmanagedType.LPWStr)]string lParam = null); static void Main(string[] args)
{
// 启动远程桌面
var p = Process.Start("mstsc"); // 等待主窗口弹出,请适当延长时间
Thread.Sleep(1000); // 获得主窗口句柄
var hWnd = p.MainWindowHandle; // 发消息设置连接地址
SetText(hWnd, 5012, lParam: "我的电脑"); // 发消息按下连接按钮
ClickButton(hWnd, 1); // 退出远程桌面
//p.CloseMainWindow();
}
}
}
SendKeys.SendWait("ParNo:2201013(PAP-50)-01\r");
使用记事本接收到的是ParNo:2201013PAP-50-01
中间的 () 怎么给SEND丢掉了