我有一个使用Windows 8键盘的C#winForms应用程序。
我通过启动tabtip.exe打开键盘。
我可以使用这样的PostMessage命令关闭键盘:
public static void HideOnScreenKeyboard()
{
uint WM_SYSCOMMAND = 274;
uint SC_CLOSE = 61536;
IntPtr KeyboardWnd = FindWindow("IPTip_Main_Window", null);
PostMessage(KeyboardWnd.ToInt32(), WM_SYSCOMMAND, (int)SC_CLOSE, 0);
}
我认为,只要传递正确的值,使用PostMessage就能以编程方式模拟几乎所有内容。
我刚刚在网上找到的用于关闭键盘的值(274和61536)。
看起来可以使用Spy ++或其他一些工具来获取这些值,但是我无法做到这一点。
有人能告诉我模拟按&123键所需要的值,以便键盘切换到数字键盘吗?
还是有人知道如何获得这些价值?
我已经尝试过Spy ++,但是不断传递着太多消息,我不知道在哪里看。
查看OnScreenKeyboard的图像以了解我的意思
最佳答案
您可以尝试使用SendInput模拟虚拟键盘窗口的&123按钮上的鼠标单击事件。
以下是如何使用SendInput将鼠标单击(left_down + left_up)发送到按钮的示例,但我没有包含以编程方式找到窗口并获取窗口大小的代码。
[StructLayout(LayoutKind.Sequential)]
public struct MINPUT
{
internal uint type;
internal short dx;
internal short dy;
internal ushort mouseData;
internal ushort dwFlags;
internal ushort time;
internal IntPtr dwExtraInfo;
internal static int Size
{
get { return Marshal.SizeOf(typeof(INPUT)); }
}
}
const ushort MOUSEEVENTF_ABSOLUTE = 0x8000;
const ushort MOUSEEVENTF_LEFTDOWN = 0x0002;
const ushort MOUSEEVENTF_LEFTUP = 0x0004;
// programatically determine the position and size of the TabTip window
// compute the location of the center of the &123 key
int coordinateX = ...
int coordinateY = ...
var pInputs = new[] {
new MINPUT() {
type = 0×01; //INPUT_KEYBOARD
dx = coordinateX,
dy = coordinateY;
dwFlags = MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_LEFTDOWN;
time = 0;
dwExtraInfo = IntPtr.Zero;
},
new MINPUT() {
type = 0×01; //INPUT_KEYBOARD
dx = coordinateX,
dy = coordinateY;
dwFlags = MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_LEFTUP;
time = 0;
dwExtraInfo = IntPtr.Zero;
}
};
SendInput((uint)pInputs.Length, pInputs, MINPUT.Size);