Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带DirectX的C#SetWindowsHookEx_C#_Windows_Keyboard_Hook_Setwindowshookex - Fatal编程技术网

带DirectX的C#SetWindowsHookEx

带DirectX的C#SetWindowsHookEx,c#,windows,keyboard,hook,setwindowshookex,C#,Windows,Keyboard,Hook,Setwindowshookex,我要写一些像截图程序的东西。现在,我将PrintWindow函数与活动窗口->GetForgroundWindow的句柄一起使用,为了启动它,我在键盘上设置了一个钩子。当我在桌面上捕获普通窗口时,这没关系,而且没有硬件加速效果,但在游戏中,钩子似乎不起作用。(我知道,PrintWindow在这里不会做任何事情,我当时正在实现一个SlimDX类)这是游戏端修改消息循环的某种问题吗?如果是的话,有没有办法让它工作:D我会欣赏C的方式,因为我不擅长用C++编程^ ^ ^ /p> 我希望这只是某种虫子

我要写一些像截图程序的东西。现在,我将PrintWindow函数与活动窗口->GetForgroundWindow的句柄一起使用,为了启动它,我在键盘上设置了一个钩子。当我在桌面上捕获普通窗口时,这没关系,而且没有硬件加速效果,但在游戏中,钩子似乎不起作用。(我知道,PrintWindow在这里不会做任何事情,我当时正在实现一个SlimDX类)这是游戏端修改消息循环的某种问题吗?如果是的话,有没有办法让它工作:D我会欣赏C的方式,因为我不擅长用C++编程^ ^ ^ /p> 我希望这只是某种虫子

格里茨·科尔迪

编辑:


因此,在桌面上,它工作得很好,但当我启动DirectX应用程序时,keyhook没有任何按键(HookCallback不是手动的)

您可以发布一些代码吗,我们这里的大多数人讲的代码都比我们的母语好,这将更好地帮助我们确定如何帮助您解决问题。好的,请关闭它。我只是继续编程我的引擎,并意识到,我也不会把钥匙传回到windows。。。
public class KeyboardHook
{
    #region Imports

    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    private static extern IntPtr SetWindowsHookEx(int idHook,
        LowLevelKeyboardProc lpfn, IntPtr hMod, uint dwThreadId);

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

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

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

    #endregion

    const int WH_KEYBOARD_LL = 13;
    const int WM_KEYDOWN = 0x0100;
    static LowLevelKeyboardProc m_proc = HookCallback;
    static IntPtr m_hookID = IntPtr.Zero;
    static Screenshot m_screen;

    public static void Hook(Screenshot screenshotManager)
    {
        m_screen = screenshotManager;
        m_hookID = SetHook(m_proc);
    }

    public static void Unhook()
    {
        UnhookWindowsHookEx(m_hookID);
    }

    private static IntPtr SetHook(LowLevelKeyboardProc proc)
    {
        using (Process curProcess = Process.GetCurrentProcess())
        using (ProcessModule curModule = curProcess.MainModule)
        {
            return SetWindowsHookEx(WH_KEYBOARD_LL, proc,
                GetModuleHandle(curModule.ModuleName), 0);
        }
    }

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

    private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)
    {
        if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN)
        {
            int vkCode = Marshal.ReadInt32(lParam);

#if DEBUG
            Debug.WriteLine(((System.Windows.Forms.Keys)vkCode).ToString());
#endif
            if ((System.Windows.Forms.Keys)vkCode == m_screen.CaptureKey)
            {
                m_screen.CaptureSimple();
            }
        }

        return CallNextHookEx(m_hookID, nCode, wParam, lParam);
    }
}