这是我用来在某个过程中模拟tab-keypress的代码:
[DllImport("user32.dll")]
static extern bool PostMessage(IntPtr hWnd, UInt32 Msg, int wParam, int lParam);
public Form1()
{
PostMessage(MemoryHandler.GetMainWindowHandle(),
(int)KeyCodes.WMessages.WM_KEYDOWN,
(int)KeyCodes.VKeys.VK_TAB, 0);
InitializeComponent();
}
Run Code Online (Sandbox Code Playgroud)
有没有办法扩展它,以便按下(例如)1秒的键,而不是只是点击它?
请注意,我对Thread.Sleep()阻止UI线程的解决方案不感兴趣.
小智 0
不确定您对 PostMessage 做了什么,但从这里修改了一些代码: SendKey.Send() 不起作用
[DllImport("user32.dll", SetLastError = true)]
static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, UIntPtr dwExtraInfo);
public static void PressKey(Keys key, bool up)
{
const int KEYEVENTF_EXTENDEDKEY = 0x1;
const int KEYEVENTF_KEYUP = 0x2;
if (up)
{
keybd_event((byte)key, 0x45, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, (UIntPtr)0);
}
else
{
keybd_event((byte)key, 0x45, KEYEVENTF_EXTENDEDKEY, (UIntPtr)0);
}
}
void TestProc()
{
PressKey(Keys.Tab, false);
Thread.Sleep(1000);
PressKey(Keys.Tab, true);
}
Run Code Online (Sandbox Code Playgroud)
也许这对你有用。只需按下一个键,然后按下一个键,中间有一个睡眠。您甚至可以进一步添加并传递您希望按键保持按下状态的时间值。