C# sendkeys 在客户端无法正常工作
C# sendkeys not working properly on client side
我正在使用 C# WinForms 开发一个工具,用于通过 TCP 共享远程桌面。
到目前为止,我所做的是桌面查看器并将鼠标点击发送到聚焦桌面共享 window。效果不错。
现在,我正在努力将按下的键发送到焦点 window,但在两种情况下它无法正常工作:
1- when I keep pressed a key
2- when I start pressing keys fast
当我打字慢时,没问题..
在 Viewer window 我有这个构造函数:
public ViewerWindow()
{
KeyDown += KeyDownHandler;
InitializeComponent();
}
这是获取按下的键并写入流以将其传递给客户端的处理程序:
public void KeyDownHandler(object sender, KeyEventArgs e)
{
var keyPressed = e.KeyData.ToString();
var key = string.Concat("keyboard", " ", keyPressed);
//sending key here
byte[] sendBytes = Encoding.UTF8.GetBytes(key);
client.GetStream().Write(sendBytes, 0, sendBytes.Length);
}
并且在实时读取循环内的 Client 端,我有以下代码来接收关键数据并进行处理:
if (incomingData.Length > 7 && incomingData.Substring(0, 8) == "keyboard")
{
string[] inf = incomingData.Split();
if (inf.Length > 1)
{
Keyboard.SendKey(inf[1]);
}
}
Keyboard 是一个带有 SendKey 方法的静态 class,只有这段代码:
public static class Keyboard
{
[DllImport("User32.dll")]
static extern int SetForegroundWindow(IntPtr point);
public static void SendKey(dynamic key)
{
SendKeys.SendWait(key);
}
}
然而,当我持续按下或快速键入按键时,我收到“键盘”字样,inf[1] 似乎有“键盘”字样,我不明白为什么......任何 suggestion/idea修好了吗?
我是从头开始做的,但不知道它是否是一个不错的解决方案...
任何帮助或指导路径将不胜感激!
谢谢。
会不会是您的 TCP 流正在缓冲发送数据,直到它达到更合适的大小?
尝试flushing写入后的流。
byte[] sendBytes = Encoding.UTF8.GetBytes(key);
var stream = client.GetStream();
stream.Write(sendBytes, 0, sendBytes.Length);
stream.Flush();
通常 TCP 连接将多个小数据块收集到一个大 TCP 数据包中以节省网络带宽。可以通过将 TcpClient.NoDelay
属性 设置为 true
来覆盖此行为,这将在每次调用 Write()
.
后导致刷新
我正在使用 C# WinForms 开发一个工具,用于通过 TCP 共享远程桌面。
到目前为止,我所做的是桌面查看器并将鼠标点击发送到聚焦桌面共享 window。效果不错。
现在,我正在努力将按下的键发送到焦点 window,但在两种情况下它无法正常工作:
1- when I keep pressed a key
2- when I start pressing keys fast
当我打字慢时,没问题..
在 Viewer window 我有这个构造函数:
public ViewerWindow()
{
KeyDown += KeyDownHandler;
InitializeComponent();
}
这是获取按下的键并写入流以将其传递给客户端的处理程序:
public void KeyDownHandler(object sender, KeyEventArgs e)
{
var keyPressed = e.KeyData.ToString();
var key = string.Concat("keyboard", " ", keyPressed);
//sending key here
byte[] sendBytes = Encoding.UTF8.GetBytes(key);
client.GetStream().Write(sendBytes, 0, sendBytes.Length);
}
并且在实时读取循环内的 Client 端,我有以下代码来接收关键数据并进行处理:
if (incomingData.Length > 7 && incomingData.Substring(0, 8) == "keyboard")
{
string[] inf = incomingData.Split();
if (inf.Length > 1)
{
Keyboard.SendKey(inf[1]);
}
}
Keyboard 是一个带有 SendKey 方法的静态 class,只有这段代码:
public static class Keyboard
{
[DllImport("User32.dll")]
static extern int SetForegroundWindow(IntPtr point);
public static void SendKey(dynamic key)
{
SendKeys.SendWait(key);
}
}
然而,当我持续按下或快速键入按键时,我收到“键盘”字样,inf[1] 似乎有“键盘”字样,我不明白为什么......任何 suggestion/idea修好了吗?
我是从头开始做的,但不知道它是否是一个不错的解决方案...
任何帮助或指导路径将不胜感激!
谢谢。
会不会是您的 TCP 流正在缓冲发送数据,直到它达到更合适的大小?
尝试flushing写入后的流。
byte[] sendBytes = Encoding.UTF8.GetBytes(key);
var stream = client.GetStream();
stream.Write(sendBytes, 0, sendBytes.Length);
stream.Flush();
通常 TCP 连接将多个小数据块收集到一个大 TCP 数据包中以节省网络带宽。可以通过将 TcpClient.NoDelay
属性 设置为 true
来覆盖此行为,这将在每次调用 Write()
.