首页 > 解决方案 > Sendkeys 无限循环

问题描述

我正在使用 RawInput 方法来拦截全局键盘击键然后将字符串发送到聚焦的前景窗口,我的问题是当我使用时sendkeys.send()我得到一个无限循环(每次触发事件)

我试图删除事件然后添加它但没有用,我在一些主题上发现问题出现了,因为我发送字符串的地方仍然集中但我需要它仍然集中,例如我是什么正在做 :

更新

    public static bool Keypressed = false;
    private void OnKeyPressed(object sender, RawInputEventArg e)
    {
        if (Keypressed){Keypressed=false;return;}

        if (cpt == 0)
        {
            cpt++;
            Console.WriteLine(e.KeyPressEvent.Name);
            //Check the Device name first !!!!
            //if(e.KeyPressEvent.Name.Contains(Settings.Default.DeviceName) || Settings.Default.DeviceName.Contains(e.KeyPressEvent.Name)) { }
            String ActiveProcess = ActiveApp.getActiveProccess();

            switch (ActiveProcess)
            {
                case "chrome":
                    if(API.getChromeUrl().Contains("facebook") || API.getChromeUrl().Contains("messenger"))
                    {

                        SendKeys.Send("1");
                        //Clipboard.SetText(""+Previous);
                        Console.WriteLine(API.getChromeUrl());
                        Keypressed = true;

                        // String Previous = Clipboard.GetText();
                        // Clipboard.SetText(FBEmo.numpad0);



                    }
                    break;
                case "mozzila":
                    break;
                case "Skype":
                    break;
                case "Viber":
                    break;


            }
            Console.WriteLine(ActiveProcess);

标签: c#eventssendkeysraw-inputkeystroke

解决方案


通过使用InputSimulator而不是 Sendkeys.Send() 可以正常工作。

InputSimulator cmd = new InputSimulator();

        if (e.KeyPressEvent.KeyPressState.Equals("BREAK"))
        {
            cpt = 0;
            Console.WriteLine(e.KeyPressEvent.Name);
            //Check the Device name first !!!!
            //if(e.KeyPressEvent.Name.Contains(Settings.Default.DeviceName) || Settings.Default.DeviceName.Contains(e.KeyPressEvent.Name)) { }
            String ActiveProcess = ActiveApp.getActiveProccess();

          switch (ActiveProcess)
            {
                case "chrome":
                    if(API.getChromeUrl().Contains("facebook") || API.getChromeUrl().Contains("messenger"))
                    {

                        switch (e.KeyPressEvent.VKeyName)
                        {
                            case "NUMPAD0":
                                cmd.Keyboard.TextEntry(FBEmo.numpad0);
                                break;

推荐阅读