【问题标题】:How to send a key to another application如何将密钥发送到另一个应用程序
【发布时间】:2013-03-08 10:45:39
【问题描述】:

我想将一个特定的键(例如 k)发送到另一个名为记事本的程序,下面是我使用的代码:

private void SendKey()
{
    [DllImport ("User32.dll")]
    static extern int SetForegroundWindow(IntPtr point);

    var p = Process.GetProcessesByName("notepad")[0];
    var pointer = p.Handle;

    SetForegroundWindow(pointer);
    SendKeys.Send("k");
}
            

但是代码不起作用,代码有什么问题?

是否可以在没有记事本的情况下将“K”发送到记事本作为活动窗口? (例如,活动窗口 = "Google chrome",记事本在后台,这意味着向后台应用程序发送密钥)?

【问题讨论】:

  • 你有什么错误吗?
  • 不,我没有,相反,它只是将“K”发送到顶部窗口
  • 看看这是否有帮助:stackoverflow.com/questions/825651/…
  • 它可以工作,但是程序所做的是将密钥发送到已经打开的程序,而不是以可编程方式启动程序
  • 如果您将 jandex stackoverflow.com/questions/2423234/… 发布的代码添加到您的表单中,那么您可以将密钥发送到任何处于活动状态的应用程序。您的程序/表单不会获得焦点,您的表单上也不会出现任何内容重点..

标签: c# sendkeys


【解决方案1】:

如果记事本已经启动,你应该写:

// import the function in your class
[DllImport ("User32.dll")]
static extern int SetForegroundWindow(IntPtr point);

//...

Process p = Process.GetProcessesByName("notepad").FirstOrDefault();
if (p != null)
{
    IntPtr h = p.MainWindowHandle;
    SetForegroundWindow(h);
    SendKeys.SendWait("k");
}

GetProcessesByName 返回一个进程数组,所以你应该得到第一个(或找到你想要的)。

如果你想启动notepad并发送密钥,你应该写:

Process p = Process.Start("notepad.exe");
p.WaitForInputIdle();
IntPtr h = p.MainWindowHandle;
SetForegroundWindow(h);
SendKeys.SendWait("k");

代码可能不起作用的唯一情况是notepad 以管理员身份启动而您的应用程序不是。

【讨论】:

  • 但我不想以编程方式启动程序,我想做的是将密钥发送给正在运行的程序,有什么办法吗?
  • @HugoWong 代码可能不起作用的唯一情况是notepad 以管理员身份启动而您的应用程序不是。
  • 我刚刚阅读了一篇关于它并不总是在 Windows 7 上运行的文章,这是我正在运行的,有趣的是,它适用于某些应用程序,但不是我想要的应用程序将文本转储到。
  • @GlennCuevas 在一个新问题中描述您的具体情况,我会很乐意回答。
  • 为什么,在 30 年后,做一些如此简单的事情(比如启动一个进程并可靠地发送击键)是如此困难。疯了。
【解决方案2】:
    public string h1;
    public string h2;
    public string m1;
    public string m2;
    public string s1;
    public string s2;

   public partial class Form1 

    hours hour = new hours();
Sendkeys.SendWait(Convert.ToString(hour.h1+hour.h2+hour.m1+hour.m2+hour.s1+hour.s2              +" "));   

使用转换为字符串过程将分类字符串发送到 sendkey 进程是一件简单的事情

【讨论】:

  • 在这种情况下,我创建了一个分类字符串序列,它将 6 个字符串发送到 sendkey 并添加一个空格
  • 只需使用 Process p = Process.GetProcessesByName("notepad").FirstOrDefault(); 打开程序Mohammad Dehghan 表示
【解决方案3】:

您可以通过先复制到剪贴板然后粘贴发送键 ctrl+v 来发送任何内容:

Process p = Process.GetProcessesByName("notepad").FirstOrDefault();

if (p != null)
{
    IntPtr h = p.MainWindowHandle;
    SetForegroundWindow(h);
    Clipboard.Clear();
    Clipboard.SetText(txtCode.Text); 
    string strClip = Clipboard.GetText();
    SendKeys.Send("^{v}");
}

【讨论】:

    猜你喜欢
    • 2012-03-29
    • 2012-12-12
    • 2018-11-12
    • 1970-01-01
    • 2017-09-20
    • 2020-11-24
    • 1970-01-01
    • 1970-01-01
    • 2020-09-20
    相关资源
    最近更新 更多