问题是,当我按下一个全局热键组合(ctrl + space)并按住按钮一秒钟时,程序会循环它并显示大量相同的文本,如:
"一些文字" "更多文字" "一些文字" "更多文字" "一些文字" "更多文字"
让我们说用户已经老了,无法快速释放键盘按钮。如何使程序执行此全局热键操作ONCE? (即使按下热键一段时间)。
我试过了(uint)fsModifiers.Control | (uint)fsModifiers.Norepeat
但没有效果。
提前谢谢!
protected override void WndProc(ref Message keyPressed)
{
if (keyPressed.Msg == 0x0312)
{
System.Threading.Thread.Sleep(300);
System.Windows.Forms.SendKeys.Send("some text");
System.Threading.Thread.Sleep(500);
System.Windows.Forms.SendKeys.Send("{TAB}");
System.Threading.Thread.Sleep(500);
System.Windows.Forms.SendKeys.Send("{TAB}");
System.Threading.Thread.Sleep(500);
System.Windows.Forms.SendKeys.Send("some more text");
MessageBox.Show("DONE", "DONE", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
base.WndProc(ref keyPressed);
}
private void Form1_Load(object sender, EventArgs e)
{
RegisterHotKey(this.Handle, 1, (uint)fsModifiers.Control , (uint)Keys.Space);
}
public enum fsModifiers
{
Alt = 0x0001,
Control = 0x0002,
Shift = 0x0004,
Window = 0x0008,
Norepeat = 0x4000,
}
答案 0 :(得分:0)
用C ++编写,我不知道C#,但代码显示了问题的可能解决方案。
Alt + F2的解决方案。
OrderedDict([('3', {'stav': '+', 'name': 'cola', 'weight': '3', 'url': 'goo.gl/2BgLmm', 'time_exp': datetime.datetime(2017, 11, 17, 23, 37, 31, 946000), '_id': ObjectId('5a13a8c396fb3488bb6a0648')}), ('2', {'stav': '+', 'name': 'cola', 'weight': '2', 'url': 'goo.gl/2BgLmm', 'time_exp': datetime.datetime(2017, 11, 17, 23, 37, 31, 946000), '_id': ObjectId('5a13a8ca96fb3488bb6a0649')})])
...
主:
static bool locked=false;
switch(uMsg)
{
case WM_HOTKEY:
{
if(wParam==ANY_IDENTIFIER_OF_HOTKEY && !locked)
{
if(windows < WINDOWS7)
{
locked=true;
SetTimer(hwnd,0x665,40,NULL);
}
doAnyAction();
}
return 0;
}
case WM_TIMER:
{
if(wParam==0x665)
{
if(!(GetAsyncKeyState(VK_F2)&0x8000)) // detected key-up
{
locked=false;
KillTimer(hwnd, 0x665);
}
}
return 0;
}
...
}
更新说这是不可能的。它对我有用。