我是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
你能告诉我一个简单的例子,所以我可以理解如何去做。
答案 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)