从c#调用自动热键脚本

本文关键字:脚本 调用 | 更新日期: 2023-09-27 18:08:58

我是c#的完全初学者,但使用自动热键的高级用户。

如果我有这个脚本,我怎么能从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

你能给我举个简单的例子吗?这样我就能明白怎么做了

从c#调用自动热键脚本

可以通过AutoHotkey.dll(有COM接口)访问。

你需要下载这个库,移动到c:'Windows'System32 .
并为系统注册(Run, % "regsvr32.exe AutoHotkey.dll", % "c:'Windows'System32") .
)然后在VS中创建一个控制台应用项目,选择project选项卡/Add reference。
在打开的窗口中找到自动热键库,单击"添加"按钮,然后关闭窗口。
现在你已经在你的项目中连接了这个库,你会在参考文件夹中看到。
在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应用程序。

我知道这是一个相当旧的帖子,但我自己刚刚遇到这个问题,并努力找到一个解决方案,因为我不能使用任何可用的包装项目AHK在c#

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

基本上你只需要将dll放在你的项目文件夹中,将其包含到项目中,并设置"复制到输出目录";Copy if newer"

然后像这样导入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文件夹中的一个)进行了测试。

睡觉很容易:

   System.Threading.Thread.Sleep(25);

获取Key和MouseDown事件(ins::和Lbutton::)时,你的应用程序不是活动的一个是非常复杂的。它可以通过使用全局钩子来实现。看看这篇CodeProject文章:一个简单的c#全局低级键盘钩子

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

您将需要使用send keys

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

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