首页 新闻 会员 周边 捐助

wpf 如何主动触发一个键盘事件 比如Ctrl+E

0
悬赏园豆:5 [已解决问题] 解决于 2014-06-23 09:03

我点击一个按钮 相当于按了 Ctrl 和S的组合键 请问大神们 如何实现 注意是在WPF中 

二线中的嗷嗷者的主页 二线中的嗷嗷者 | 初学一级 | 园豆:14
提问于:2014-06-20 17:42
< >
分享
最佳答案
0

使用系统API

        [DllImport("user32.dll", SetLastError = true)]
        public static extern uint SendInput(uint nInputs, INPUT[] pInputs, uint cbSize);

收获园豆:5
诶碧司 | 小虾三级 |园豆:1912 | 2014-06-20 18:01

能给一个下例子吗 我把分给你 

比如说 点击一个按钮 再 sendinput ctrl + S

二线中的嗷嗷者 | 园豆:14 (初学一级) | 2014-06-23 09:03

请问这个API怎去调用?

二线中的嗷嗷者 | 园豆:14 (初学一级) | 2014-06-23 09:37

@我想成为技术大咖: 下面是一个例子

       [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));
        }

 

诶碧司 | 园豆:1912 (小虾三级) | 2014-06-23 12:26

@诶碧司: 大神你好厉害 能收我为徒吗?

我用了你的实例代码 点击了“编辑”按钮运行 那段代码 好像不起作用  

在 播放ppt的webbrowser上 按 Ctrl + E 理应该是 进入编辑模式 但是 实际上 没有反应  

请指示啊  

二线中的嗷嗷者 | 园豆:14 (初学一级) | 2014-06-23 13:46

@诶碧司: 

二线中的嗷嗷者 | 园豆:14 (初学一级) | 2014-06-23 13:48

@我想成为技术大咖: 上面的例子也是我在网上找的,如果不行,你试试把inDown.ki.dwFlags = KEYEVENTF_KEYUP;改为inDown.ki.dwFlags = 0;看看

还有就是测试的时候新建一个项目来测试,以避免受其它因素干扰而导致失败

诶碧司 | 园豆:1912 (小虾三级) | 2014-06-24 09:23

@诶碧司: 

我按你说的 把inDown.ki.dwFlags = KEYEVENTF_KEYUP;改为inDown.ki.dwFlags = 0试了试 

的确按下了 ctrl键  而且是一直 按着的 但是 E 键 没有按 

我按了下E键 达到了 效果 

二线中的嗷嗷者 | 园豆:14 (初学一级) | 2014-06-24 09:49

@我想成为技术大咖: 那就证明有效果了,再按照下面更改一下

        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));
        }
诶碧司 | 园豆:1912 (小虾三级) | 2014-06-24 10:16

@诶碧司: 

大师  我新建了 一个项目 按照你说的  可以的!! 好开心 。

但是  在 webbrowser 中的 ppt 还是 不起作用  我怀疑是 ppt这个 线程 没有 获取到 焦点  

请问 有没有 模拟 在 某个位置 点击鼠标事件的  功能   

让 ppt 先获取焦点 然后再 send ctrl+e

这样的话  就能实现点击 编辑按钮 让 webbrowser中的ppt 进入 编辑模式了。

二线中的嗷嗷者 | 园豆:14 (初学一级) | 2014-06-24 11:07

@诶碧司: 

大师 能留个号码吗 我要拜你为师。。。

二线中的嗷嗷者 | 园豆:14 (初学一级) | 2014-06-24 11:33

@我想成为技术大咖: 模拟鼠标点击的不知道有没有,不过你可以试试SetForegroundWindow这个方法,具体用法搜索一下吧

至于拜师就算了,我也是半桶水,答案都是网上搜的,你也可以更多借助网络来解决自己的问题

诶碧司 | 园豆:1912 (小虾三级) | 2014-06-24 11:41
其他回答(1)
0

首先谢谢你的文章,(不知你有没有解决这个问题)现在跟你说一声解决Ctrl一直按下的问题,你弄一个键盘松开事件,在事件把inDown.ki.dwFlags = 0;

变成inDown.ki.dwFlags = KEYEVENTF_KEYUP;就行了

红色的枫 | 园豆:202 (菜鸟二级) | 2017-09-21 14:41
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册