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