从C#调用Autohotkey脚本

时间:2013-04-11 21:19:24

标签: c# autohotkey

我是C#的初学者,但是使用autohotkey的高级用户。

如果我有这个脚本,我怎么能用C#调用它?

    ins::suspend
    SendMode Input
    Lbutton::
    Loop
    {
    GetKeyState, state, Lbutton, P
    if state=U
    break
    Sendinput {Click down}
    Sleep 25
    Sendinput {Click up}
    Sleep 25
    }
    return

你能告诉我一个简单的例子,所以我可以理解如何去做。

4 个答案:

答案 0 :(得分:8)

这可以通过AutoHotkey.dll(具有COM接口)来实现。

您需要下载此库,请转入c:\Windows\System32 并注册系统(运行,% "regsvr32.exe AutoHotkey.dll"% "c:\Windows\System32") 然后在VS中创建一个控制台应用程序项目,并选择Project选项卡/ Add reference 在打开的窗口中找到AutoHotkey库,单击“添加”按钮,然后关闭窗口 所以现在您已经在项目中连接了这个库,这将在参考文件夹中看到 在Program.cs中选择all并替换此代码:

using System.Threading;
using AutoHotkey;

namespace work_with_AHK_object
{
    class Program
    {
        static void Main()
        {
            /// write content for ahk script (thread)
            string scriptContent=""
            //+"#NoTrayIcon\n"
            +"#KeyHistory, 0\n"
            +"#NoEnv\n"
            //+"ListLines, Off\n"
            //+"DetectHiddenWindows, On\n"
            //+"Process, Priority,, High\n"
            +"SetBatchLines, -1\n"
            +"SetMouseDelay, 25\n"
            //+"Menu, Tray, Icon, % \"shell32.dll\", -153\n"
            //+"WinSet, AlwaysOnTop, On, % \"ahk_id\"A_ScriptHwnd\n"
            //+"WinSet, Style, -0xC00000, % \"ahk_id\"A_ScriptHwnd\n"
            //+"WinMove, % \"ahk_id\"A_ScriptHwnd,, 888, 110, 914, 812\n"
            //+"ListLines\n"
            //+"ListLines, On\n"
            +"TrayTip,, % \"Ready to use!\"\n" /// some notice
            +""
            +"Ins::\n"
            +"   Suspend\n"
            +"   Loop, % A_IsSuspended ? 1:2\n"
            +"      SoundBeep, 12500, 50\n"
            +"   KeyWait, % A_ThisHotkey\n"
            +"   Return\n"
            +""
            +"LButton::\n"
            +"   Loop\n"
            +"      Send, {Click}\n"
            +"   Until, !GetKeyState(\"LButton\", \"P\")\n"
            +"   Return\n"
            +""
            +"Space::\n"
            +"   Suspend, Off\n"
            +"   ExitApp";

            /// initialize instance
            CoCOMServer ahkThread=new CoCOMServer();

            /// launch a script in a separate thread
            ahkThread.ahktextdll(scriptContent);

            /// wait for exit
            while (ahkThread.ahkReady()!=0) Thread.Sleep(1000);
         }
    }
}

打开项目属性,在“应用程序”选项卡中将其输出类型更改为Windows应用程序。

答案 1 :(得分:1)

睡眠很容易:

   System.Threading.Thread.Sleep(25);

当你的应用程序不是活动应用程序时获取Key和MouseDown事件(ins ::和Lbutton::)会复杂得多。它可以通过使用全局钩子来实现。请查看此CodeProject文章A Simple C# Global Low Level Keyboard Hook

最终,这取决于你为什么要使用C#,而AHK为你提供了一个更简单的环境来实现类似的东西。

我无法想到任何能够完成这项工作的简单例子。

答案 2 :(得分:1)

我知道这是一篇很老的帖子,但我自己也遇到了这个问题,并努力寻找解决方案,因为我无法在 C# 中使用任何可用的 AHK 包装器项目。

如果注册 dll 或使用包装器对您来说也有问题,您可以使用 ahk 论坛 by basi 上的这篇文章中的方法。

基本上,您只需将 dll 放在项目文件夹中,将其包含到项目中,并在属性中将“复制到输出目录”设置为“如果更新则复制”。

然后像这样导入dll函数:

        [DllImport(
        "AutoHotkey.dll", 
        CallingConvention = CallingConvention.Cdecl, 
        CharSet = CharSet.Unicode, 
        EntryPoint = "ahkdll")]
    private static extern int ahkdll(
        [MarshalAs(UnmanagedType.LPWStr)] string scriptFilePath,
        [MarshalAs(UnmanagedType.LPWStr)] string parameters = "",
        [MarshalAs(UnmanagedType.LPWStr)] string title = "");

    [DllImport(
        "AutoHotkey.dll",
        CallingConvention = CallingConvention.Cdecl,
        CharSet = CharSet.Unicode,
        EntryPoint = "ahktextdll")]
    private static extern int ahktextdll(
        [MarshalAs(UnmanagedType.LPWStr)] string script,
        [MarshalAs(UnmanagedType.LPWStr)] string parameters =  "",
        [MarshalAs(UnmanagedType.LPWStr)] string title = "");

ahkdll 允许从文件运行脚本,ahktextdll 允许直接将脚本作为字符串插入。

我只用来自 HotKeyIt 的 v1 dll 测试了这个(我使用了 win32w 文件夹中的那个)。

答案 3 :(得分:0)

您想要使用发送密钥

这段视频就是一个很好的例子!

http://www.youtube.com/watch?v=FyDEelZbmEc