【问题标题】:Sendkeys infinite loopSendkeys 无限循环
【发布时间】:2018-08-11 21:22:20
【问题描述】:

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

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

  • 用户在 facebook Messenger 中按 numpad0
  • 我用我自己的字符串替换了 numpad0

更新

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

【问题讨论】:

  • 如果我在关注,你在钩住按键事件,当有按键时,你在模拟一个按键,你的钩子在捕捉它,等等。您是否考虑过在 sendKeys 之前设置一个标志(比如“bool myKeypress”)(然后立即清除)。如果您的钩子在设置该标志时被调用,您只需忽略它。
  • @Flydog57 是的,即使有标志,事件也将始终处于活动状态,所以当我将标志设为真时,它会恢复
  • 我在你的代码中没有看到任何类似标志的东西
  • @Flydog57 查看更新
  • 就像事件总是在某个队列中并且每次开始时,当我重新打开应用程序窗口时,当我专注于它返回的信使字段时它会停止

标签: c# events sendkeys raw-input keystroke


【解决方案1】:

使用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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-25
    • 1970-01-01
    • 2013-09-05
    • 1970-01-01
    相关资源
    最近更新 更多