C# Windows SendInput(键盘)在断开连接时不工作
我正在运行一个c#应用程序,它在windows中使用sendinputs方法来模拟击键。当我远程访问实例时,它工作正常,但一旦我注销,它就会抛出一个异常。有人能就为什么会发生这种情况以及如何避免这种情况提供一些想法吗 更新:: 下面是一些可以重现问题的示例代码C# Windows SendInput(键盘)在断开连接时不工作,c#,windows,amazon-ec2,C#,Windows,Amazon Ec2,我正在运行一个c#应用程序,它在windows中使用sendinputs方法来模拟击键。当我远程访问实例时,它工作正常,但一旦我注销,它就会抛出一个异常。有人能就为什么会发生这种情况以及如何避免这种情况提供一些想法吗 更新:: 下面是一些可以重现问题的示例代码 using System.Runtime.InteropServices; using System.Windows.Forms; namespace ConsoleApplication6 { class Program
using System.Runtime.InteropServices;
using System.Windows.Forms;
namespace ConsoleApplication6
{
class Program
{
class SendKey
{
[StructLayout(LayoutKind.Sequential)]
private struct MOUSEINPUT
{
public int dx;
public int dy;
public int mouseData;
public int dwFlags;
public int time;
public int dwExtraInfo;
};
[StructLayout(LayoutKind.Sequential)]
private struct KEYBDINPUT
{
public short wVk;
public short wScan;
public int dwFlags;
public int time;
public int dwExtraInfo;
};
[StructLayout(LayoutKind.Sequential)]
private struct HARDWAREINPUT
{
public int uMsg;
public short wParamL;
public short wParamH;
};
[StructLayout(LayoutKind.Explicit)]
private struct INPUT
{
[FieldOffset(0)]
public int type;
[FieldOffset(4)]
public MOUSEINPUT no;
[FieldOffset(4)]
public KEYBDINPUT ki;
[FieldOffset(4)]
public HARDWAREINPUT hi;
};
[DllImport("user32.dll")]
private extern static void SendInput(int nInputs, ref INPUT pInputs, int cbsize);
[DllImport("user32.dll", EntryPoint = "MapVirtualKeyA")]
private extern static int MapVirtualKey(int wCode, int wMapType);
private const int INPUT_KEYBOARD = 1;
private const int KEYEVENTF_KEYDOWN = 0x0;
private const int KEYEVENTF_KEYUP = 0x2;
private const int KEYEVENTF_EXTENDEDKEY = 0x1;
private void Send(Keys key, bool isEXTEND)
{
INPUT inp = new INPUT();
inp.type = INPUT_KEYBOARD;
inp.ki.wVk = (short)key;
inp.ki.wScan = (short)MapVirtualKey(inp.ki.wVk, 0);
inp.ki.dwFlags = ((isEXTEND) ? (KEYEVENTF_EXTENDEDKEY) : 0x0) | KEYEVENTF_KEYDOWN;
inp.ki.time = 0;
inp.ki.dwExtraInfo = 0;
SendInput(1, ref inp, Marshal.SizeOf(inp));
System.Threading.Thread.Sleep(100);
inp.ki.dwFlags = ((isEXTEND) ? (KEYEVENTF_EXTENDEDKEY) : 0x0) | KEYEVENTF_KEYUP;
SendInput(1, ref inp, Marshal.SizeOf(inp));
}
static void Main()
{
while(true)
{
System.Threading.Thread.Sleep(2000);
SendKey s = new SendKey();
s.Send(Keys.Z, false);
s.Send(Keys.Left, true);
}
}
}
}
}
如果您构建此应用程序,并在一个免费的windows server ec2实例上运行它,并将记事本设置为焦点,则当您远程进入该实例时,它将持续打印zzzzzz,但是,一旦您远程离开该实例,它将停止打印,直到您重新登录。欢迎使用此应用程序。你能发布你的代码吗,这样我们就可以看到发生了什么?欢迎来到so。最好能有一些澄清。这是什么样的申请?Windows服务、控制台应用程序、Web应用程序等。您试图如何运行它?寻求调试帮助的问题(“为什么此代码不工作?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现此代码所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。请参阅:一旦我注销-程序运行在什么上下文中?你说的“注销”是什么意思?断开与远程会话的连接或实际注销?