我点击一个按钮 相当于按了 Ctrl 和S的组合键 请问大神们 如何实现 注意是在WPF中
使用系统API
[DllImport("user32.dll", SetLastError = true)]
public static extern uint SendInput(uint nInputs, INPUT[] pInputs, uint cbSize);
能给一个下例子吗 我把分给你
比如说 点击一个按钮 再 sendinput ctrl + S
请问这个API怎去调用?
@我想成为技术大咖: 下面是一个例子
[DllImport("user32.dll")] public static extern UInt32 SendInput(UInt32 nInputs, ref INPUT pInputs, int cbSize); [StructLayout(LayoutKind.Explicit)] public struct INPUT { [FieldOffset(0)] public Int32 type; [FieldOffset(4)] public KEYBDINPUT ki; [FieldOffset(4)] public MOUSEINPUT mi; [FieldOffset(4)] public HARDWAREINPUT hi; } [StructLayout(LayoutKind.Sequential)] public struct MOUSEINPUT { public Int32 dx; public Int32 dy; public Int32 mouseData; public Int32 dwFlags; public Int32 time; public IntPtr dwExtraInfo; } [StructLayout(LayoutKind.Sequential)] public struct KEYBDINPUT { public Int16 wVk; public Int16 wScan; public Int32 dwFlags; public Int32 time; public IntPtr dwExtraInfo; } [StructLayout(LayoutKind.Sequential)] public struct HARDWAREINPUT { public Int32 uMsg; public Int16 wParamL; public Int16 wParamH; } public const int INPUT_KEYBOARD = 1; public const int KEYEVENTF_KEYUP = 0x0002; private void button1_Click(object sender, EventArgs e) { INPUT inDown = new INPUT(); inDown.type = INPUT_KEYBOARD; inDown.ki.wVk =KeyInterop.VirtualKeyFromKey(Keys.LeftCtrl); inDown.ki.dwFlags = KEYEVENTF_KEYUP; SendInput(1, ref inDown, Marshal.SizeOf(inDown)); inDown.ki.wVk =KeyInterop.VirtualKeyFromKey(Keys.S); SendInput(1, ref inDown, Marshal.SizeOf(inDown)); }
@诶碧司: 大神你好厉害 能收我为徒吗?
我用了你的实例代码 点击了“编辑”按钮运行 那段代码 好像不起作用
在 播放ppt的webbrowser上 按 Ctrl + E 理应该是 进入编辑模式 但是 实际上 没有反应
请指示啊
@诶碧司:
@我想成为技术大咖: 上面的例子也是我在网上找的,如果不行,你试试把inDown.ki.dwFlags = KEYEVENTF_KEYUP;改为inDown.ki.dwFlags = 0;看看
还有就是测试的时候新建一个项目来测试,以避免受其它因素干扰而导致失败
@诶碧司:
我按你说的 把inDown.ki.dwFlags = KEYEVENTF_KEYUP;改为inDown.ki.dwFlags = 0试了试
的确按下了 ctrl键 而且是一直 按着的 但是 E 键 没有按
我按了下E键 达到了 效果
@我想成为技术大咖: 那就证明有效果了,再按照下面更改一下
private void button1_Click(object sender, EventArgs e) { INPUT inDown = new INPUT(); inDown.type = INPUT_KEYBOARD; inDown.ki.wVk =KeyInterop.VirtualKeyFromKey(Keys.LeftCtrl); inDown.ki.dwFlags = 0; // 按下Ctrl键 SendInput(1, ref inDown, Marshal.SizeOf(inDown)); // 按下S键 inDown.ki.wVk =KeyInterop.VirtualKeyFromKey(Keys.S); SendInput(1, ref inDown, Marshal.SizeOf(inDown)); inDown.ki.dwFlags = KEYEVENTF_KEYUP; // 放开S键 SendInput(1, ref inDown, Marshal.SizeOf(inDown)); inDown.ki.wVk =KeyInterop.VirtualKeyFromKey(Keys.LeftCtrl); // 放开Ctrl键 SendInput(1, ref inDown, Marshal.SizeOf(inDown)); }
@诶碧司:
大师 我新建了 一个项目 按照你说的 可以的!! 好开心 。
但是 在 webbrowser 中的 ppt 还是 不起作用 我怀疑是 ppt这个 线程 没有 获取到 焦点
请问 有没有 模拟 在 某个位置 点击鼠标事件的 功能
让 ppt 先获取焦点 然后再 send ctrl+e
这样的话 就能实现点击 编辑按钮 让 webbrowser中的ppt 进入 编辑模式了。
@诶碧司:
大师 能留个号码吗 我要拜你为师。。。
@我想成为技术大咖: 模拟鼠标点击的不知道有没有,不过你可以试试SetForegroundWindow这个方法,具体用法搜索一下吧
至于拜师就算了,我也是半桶水,答案都是网上搜的,你也可以更多借助网络来解决自己的问题
首先谢谢你的文章,(不知你有没有解决这个问题)现在跟你说一声解决Ctrl一直按下的问题,你弄一个键盘松开事件,在事件把inDown.ki.dwFlags = 0;
变成inDown.ki.dwFlags = KEYEVENTF_KEYUP;就行了