0

I'm about to write something like a screenshot programm. For now I used the PrintWindow function with the handle of the active window -> GetForgroundWindow and to start it I set a hook on the keyboard. When I capture normal windows on the desktop it's ok, besides there is no hardware accelerated effects, but in a game the hook doesn't seem to work. (I know, that the PrintWindow won't do anything here, I'm implementing a SlimDX class at the time) Is that some sort of a problem with the game-side modified message loop? And if yes, is there a way to make it work :D I would appreciate a C# way, cause I'm bad at programming UI with C++ ^^

I hope it is just some sort of bug...

Greetz Coldi

EDIT:

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);
    }
}    

So on desktop it works pretty fine, but when I start a DirectX application, the keyhook doesn't get any pressed key (HookCallback isn't handeled)

ColdJackle
  • 31
  • 6
  • Can you please post some code, most of us here speak code better than our native language, and it will better help us determine how to help you with your problem. – Zach Spencer Feb 28 '14 at 21:30
  • Ok close that. I just continued programming my engine and realized, that I also don't pass the keys back to windows... – ColdJackle Mar 02 '14 at 23:27

0 Answers0