6

我是 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

4 回答 4

8

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

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

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 应用程序。

于 2013-05-23T05:27:49.893 回答
1

睡觉很简单:

   System.Threading.Thread.Sleep(25);

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

最终,当 AHK 为您提供更简单的环境来实现类似的事情时,这取决于您为什么要使用 C#。

我想不出任何可以完成这项工作的简单示例。

于 2013-04-11T23:27:35.073 回答
1

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

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

本质上,您只需将 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 文件夹中的那个)。

于 2021-05-03T11:22:12.557 回答
0

您将要使用发送密钥

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

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

于 2013-04-11T21:23:42.497 回答