在另一个应用程序中模拟按下和释放按键?

3

我需要与运行的外部应用程序进行交互,并发送特定的按键和释放。我尝试使用SendKeys类,但它只完成了一半的工作,因为按键是立即释放到外部应用程序中的。

我需要能够模拟外部应用程序的“按键按下”。现在我正在尝试使用SendMessage,但目前它根本不起作用:(,我甚至没有收到错误提示。


1
我认为SendKeys和SendMessage都不会满足您的要求。抱歉,伙计,我也一窍不通。 - o.k.w
请查看我在 https://dev59.com/ekXRa4cB1Zd3GeqPrmok#9509588 的回答。 - Ohad Schneider
4个回答

4

好的,问题解决了。我实际上安装了VC++来尝试核心keybd_event()函数,在它成功工作后,我能够在C#中明智地使用它。

这里是代码,令人惊讶的是它非常简单。您需要添加此代码以导入dlls:using System.Runtime.InteropServices;

此代码将按住“1”按钮3秒钟,然后释放1秒钟并重复该过程。

(代码突出显示混乱了 :/,请从 'namespace ...' 复制到最后一个括号 '}')

public class Program 
{ 
    [DllImport("user32.dll")] 
    private static extern void keybd_event(byte bVk, byte bScan, 
        uint dwFlags, UIntPtr dwExtraInfo);

    private static void Main(string[] args)
    {            
        while (true)
        {
            keybd_event((byte)0x31, (byte)0x02, 0, UIntPtr.Zero);
            Thread.Sleep(3000);

            keybd_event((byte)0x31, (byte)0x82, (uint)0x2, UIntPtr.Zero);
            Thread.Sleep(1000);
        }
    }
}

2
你尝试过使用PostMessage发送WM_KEYDOWNWM_KEYUP吗?
编辑
你可以这样使用它(我用C++写的,但你也可以轻松地使用PInvoke和.NET)。
HWND hwnd = FindWindow(NULL,_T("Mywindow"));
PostMessage(hwnd,WM_KEYDOWN,VK_A,0);

你能给我展示一个可用的代码片段吗?我已经苦苦寻找了三天,除了SendKeys之外,什么都没有起作用。 - MeLight
1
我添加了一个链接到pinvoke.net,您可以在其中找到给定函数的PInvoke头文件。 - R. Martinho Fernandes
好的,我尝试调整了您的解决方案并将其运行在C#中,我还从Pinvoke获取了头文件(我想是这样!)。它仍然无法正常工作,我感觉自己陷入了一些我不理解的递归中...有没有人能解释为什么SendMessage不起作用,或者提供一个PostMessage的C#示例? - MeLight
你能否发布一下你所拥有的示例代码,并更好地描述一下你看到的发生情况(或者没有发生)与你期望发生的情况之间的差异? - Jason D
对于WM_KEYDOWN和WM_KEYUP的工作,通常需要遍历组件层次结构以找到实际要发送到的组件。建议使用SendInput,尽管它要复杂得多。 - undefined

1
你可以使用WSH脚本外壳来完成这个任务:
var shell   = new WshShellClass();
var missing = System.Reflection.Missing.Value;

shell.SendKeys("MOO!!!", ref missing);

你所需要做的就是添加一个 COM 引用到“Windows Scripting Host Object”,版本 1.0。所有内容都在命名空间 IWshRuntimeLibrary 中。

0

我已经苦苦寻找C#的可用示例超过3天了...如果有人能提供一个,我将不胜感激。 - MeLight
在谷歌上搜索C# "SendInput",我找到了这个链接:http://blogs.msdn.com/robgruen/archive/2004/05/10/129221.aspx - MSN

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接