我想使用mono编写一个简单的CL工具,用于注册系统中的每次点击。我知道我可以从Windows窗体访问它吗?就像内部Windows API的包装器一样?

抱歉,这是一个真正的愚蠢问题,但是来自JS背景,在这里它的AddEventListener有点令人迷惑,或者记录得很差。谢谢

最佳答案

您正在寻找的是user32.dll

这里是一些链接:

http://pinvoke.net/default.aspx/user32.GetAsyncKeyState

https://msdn.microsoft.com/en-us/library/windows/desktop/ms646293(v=vs.85).aspx

looking up that the user press a key or not?

第一个链接包含有关如何使用dll的示例。

您可以使用此dll执行多项操作。例如,您所追求的是

[DllImport("User32.dll")]
private static extern short GetAsyncKeyState(System.Windows.Forms.Keys vKey);
[DllImport("User32.dll")]
private static extern short GetAsyncKeyState(System.Int32 vKey);

为此,您每次需要检查按键是否按下时都需要检查按键。您可以使用virtual key code或使用Keys类。

如果您还想模拟鼠标事件,例如向系统发送左键单击,则下面的代码就是您要执行的操作。 (更多信息here)
[DllImport("user32.dll")]
static extern void mouse_event(uint dwFlags, int dx, int dy, uint dwData, int dwExtraInfo);

我不久前做了类似的事情,但是我却迷上了键盘而不是鼠标。这个过程是相似的,但是插入一个特定的程序要容易得多。下面的代码说明了我如何解决我的问题。

在下面的代码中,我创建了一个事件,该事件在按下任何键时触发,并将键代码作为事件参数发送。
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace KeyHook {
    public class KeyHook {
        const int WH_KEYBOARD_LL = 13;

        const int WM_KEYDOWN = 0x0100;
        const int WM_KEYUP = 0x0101;

        delegate IntPtr LowLevelKeyboardProc(int nCode, IntPtr wParam, IntPtr lParam);

        LowLevelKeyboardProc _proc { get; set; }

        IntPtr _hookID { get; set; }

        public delegate void KeyHandler(Keys k);
        public event KeyHandler OnKeyDown;
        public event KeyHandler OnKeyUp;

        public KeyHook() {
            Initialize();
            _hookID = SetHook(_proc);
        }

        void Initialize() {
            this._proc = HookCallback;
            this._hookID = IntPtr.Zero;
            Application.ApplicationExit += Application_ApplicationExit;
        }

        void Application_ApplicationExit(object sender, EventArgs e) {
            UnhookWindowsHookEx(_hookID);
        }

        IntPtr SetHook(LowLevelKeyboardProc proc) {
            using (Process curProcess = Process.GetCurrentProcess()) {
                using (ProcessModule curModule = curProcess.MainModule) {
                    return SetWindowsHookEx(WH_KEYBOARD_LL, proc, GetModuleHandle

(curModule.ModuleName), 0);
                }
            }
        }

        IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam) {
            if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN) {
                if (this.OnKeyDown != null) {
                    this.OnKeyDown((Keys)Marshal.ReadInt32(lParam));
                }
            } else if (nCode >= 0 && wParam == (IntPtr)WM_KEYUP) {
                if (this.OnKeyUp != null) {
                    this.OnKeyUp((Keys)Marshal.ReadInt32(lParam));
                }
            }
            return CallNextHookEx(_hookID, nCode, wParam, lParam);
        }

        #region dll Imports
        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        static extern IntPtr SetWindowsHookEx(int idHook, LowLevelKeyboardProc lpfn, IntPtr hMod,

uint dwThreadId);


        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        static extern bool UnhookWindowsHookEx(IntPtr hhk);


        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam);


        [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        static extern IntPtr GetModuleHandle(string lpModuleName);
        #endregion
    }
}

10-07 18:55
查看更多