用SendKeys发送字母'i'

Ozg*_*gus 9 c# pinvoke sendkeys winforms

我用c#Windows Forms制作了一个屏幕键盘.我使用Sendkeys.Send()函数发送击键.除了这封信之外的所有信件都i很好.当我i打开Microsoft Word时按下键盘上的字母时,它会发送Ctrl+ Alt+ I并打开打印对话框.在Notepad ++中也是如此.但是当我尝试输入记事本时,它工作正常.

在我的代码中,我发送键,SendKeys.Send(value);其中value是按下按钮的文本.我使用以下代码获取文本:

string s = ((Button)sender).Text;
Run Code Online (Sandbox Code Playgroud)

关于它为什么不能正常工作的任何评论?

编辑:我只用一个按钮创建了一个新的Windows窗体项目,整个代码如下.还是行不通.任何想法将不胜感激.

public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            SendKeys.Send("i");
        }

        // Prevent form being focused
        const int WS_EX_NOACTIVATE = 0x8000000;
        protected override CreateParams CreateParams
        {
            get
            {
                CreateParams ret = base.CreateParams;
                ret.ExStyle |= WS_EX_NOACTIVATE;
                return ret;
            }
        }  
    }
Run Code Online (Sandbox Code Playgroud)

被覆盖的功能是防止表单被聚焦.这样我就可以将键击发送到具有焦点的其他应用程序.

小智 1

两种选择:

1- 模拟按键,请参阅http://msdn2.microsoft.com/en-us/library/system.windows.forms.sendkeys(VS.71).aspx

样本:

public static void ManagedSendKeys(string keys)
        {
            SendKeys.SendWait(keys);
            SendKeys.Flush();
        }
Run Code Online (Sandbox Code Playgroud)

2- 向窗口发送一个按键,按住该按钮 x 秒

[DllImport("user32.dll")]
public static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, UIntPtr dwExtraInfo);
public static void KeyboardEvent(Keys key, IntPtr windowHandler, int delay)
        {
            const int KEYEVENTF_EXTENDEDKEY = 0x1;
            const int KEYEVENTF_KEYUP = 0x2;
            keybd_event((byte)key, 0x45, KEYEVENTF_EXTENDEDKEY, (UIntPtr)0);
            Thread.Sleep(delay);
            keybd_event((byte)key, 0x45, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, (UIntPtr)0);
        }
Run Code Online (Sandbox Code Playgroud)