在Numpad上发送特定键,如+, - ,/或Enter(模拟按键)

And*_*iff 6 .net c# keyboard automation sendkeys

我正在开发一个项目,在这个项目中,有必要模拟按键以在不同的应用程序中引起特定的行为.

使用正在导入的keybd_event函数(可能有更好的方法,但它工作正常),一切运行良好.

现在我想为所有的numpad添加特定的支持.

在这里查看http://msdn.microsoft.com/en-us/library/dd375731(v=VS.85).aspx或在System.Windows.Input.Key命名空间中,我可以轻松找到Num0的键. Num9,以及NumLock.但是......我找不到Num /,Num +,NumEnter等的任何东西.

我写了一个快速的应用程序来捕获keydown事件,输出事件参数,并得到一些有趣的结果:

e.KeyCode NumLock e.KeyData NumLock e.KeyValue 144 e.Modifiers None  
e.KeyCode Divide e.KeyData Divide e.KeyValue 111 e.Modifiers None  
e.KeyCode Multiply e.KeyData Multiply e.KeyValue 106 e.Modifiers None  
e.KeyCode Subtract e.KeyData Subtract e.KeyValue 109 e.Modifiers None  
e.KeyCode Add e.KeyData Add e.KeyValue 107 e.Modifiers None  
e.KeyCode NumLock e.KeyData NumLock e.KeyValue 144 e.Modifiers None  
e.KeyCode NumLock e.KeyData NumLock e.KeyValue 144 e.Modifiers None  
e.KeyCode Divide e.KeyData Divide e.KeyValue 111 e.Modifiers None  
e.KeyCode Multiply e.KeyData Multiply e.KeyValue 106 e.Modifiers None  
e.KeyCode Subtract e.KeyData Subtract e.KeyValue 109 e.Modifiers None  
e.KeyCode Add e.KeyData Add e.KeyValue 107 e.Modifiers None  
e.KeyCode Return e.KeyData Return e.KeyValue 13 e.Modifiers None
Run Code Online (Sandbox Code Playgroud)

Num + Key(等等)似乎是Windows调用功能键的键(如Num +键的F18).所以...这很奇怪,但还可以.

但是..我无法区分Enter-Key和NumEnter Key.这些与我的应用程序不同,因此我必须为两者发送特定的密钥代码.

这是我的问题:如何发送普通的输入密钥以及如何发送NumEnter密钥?

(我不知道它是否有任何区别,我正在使用德语键盘布局.)

感谢任何想法!

And*_*iff 0

由于您正在谈论一种相反的解决方案,即检测事件,并且我想引发它,所以我什至不必重写 WndProc。我可以简单地发送我自己的消息。

从您的解决方案中,我查看了 SendMessage/PostMessage,然后查看了 WM_KEYDOWN 和 WM_KEYUP。该文档实际上为您提供了信息(如果您真的很努力的话)。

http://msdn.microsoft.com/en-us/library/ms646280(v=vs.85).aspx
http://msdn.microsoft.com/en-us/library/ms646281(v=vs.85) .aspx

所以我的解决方案(编译并现在找到正确的窗口(在哪里输入文本))是这样的:

 bool keyDown = true; // true = down, false = up
 const uint WM_KEYDOWN = 0x0100;
 const uint WM_KEYUP = 0x0101;
 const int VK_RETURN = 0x0D;

 IntPtr handle = IntPtr.Zero;
 // Obtain the handle of the foreground window (active window and focus window are only relative to our own thread!!)
 IntPtr foreGroundWindow = GetForegroundWindow();
 // now get process id of foreground window
 uint processID;
 uint threadID = GetWindowThreadProcessId(foreGroundWindow, out processID);
 if (processID != 0)
 {
 // now get element with (keyboard) focus from process
 GUITHREADINFO threadInfo = new GUITHREADINFO();
 threadInfo.cbSize = Marshal.SizeOf(threadInfo);
 GetGUIThreadInfo(threadID, out threadInfo);
 handle = (IntPtr)threadInfo.hwndFocus;
 }

 int lParam = 1 << 24; // this specifies NumPad key (extended key)
 lParam |= (keyDown) ? 0 : (1 << 30 | 1 << 31); // mark key as pressed if we use keyup message
 PostMessage(handle, (keyDown) ? WM_KEYDOWN : WM_KEYUP, VK_RETURN, lParam); // send enter
Run Code Online (Sandbox Code Playgroud)

希望它对其他人也有用。正如《仇杀队》给我的提示一样。

并且..如果您确实有更好的解决方案,请说出来!