• R/O
  • SSH
  • HTTPS

Tags
No Tags

Frequently used words (click to add to your profile)

javac++androidlinuxc#windowsobjective-ccocoa誰得qtpythonphprubygameguibathyscaphec計画中(planning stage)翻訳omegatframeworktwitterdomtestvb.netdirectxゲームエンジンbtronarduinopreviewer

テンキー押下でWin32アプリのウインドウをキャプチャする。ただしUWPアプリはキャプチャできない。


File Info

Rev. 95
크기 3,528 bytes
Time 2018-03-05 12:48:44
Author hor931101jp
Log Message

(empty log message)

Content

/***********************************************************//*!
 * @brief キーボードフック処理
 * @author S.Hori
 * @date 
 * 2018-02-10 初版<br>
 * @details
 **************************************************************/using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using static TenKeyCapture.ClassMyCommon;

namespace TenKeyCapture
{
    /***********************************************************//*!
     * @brief キーボードフック処理クラス
     **************************************************************/
    class KeyboardHooker
    {
        private const uint WM_KEYDOWN = 0x100;
        private const uint WM_KEYUP = 0x101;
        private const int WH_KEYBOARD_LL = 13;
        private static IntPtr hHook;

        private Callback hookproc;

        public KeyboardHooker()
        {
            hookproc = KeybordHookProc;
            hHook = SetWindowsHookEx(WH_KEYBOARD_LL, hookproc, GetModuleHandle(System.Diagnostics.Process.GetCurrentProcess().MainModule.ModuleName), 0);
            if (hHook == null)
            {
                Log.Put("SetWindowsHookEx Failed");
            }
        }

        public delegate IntPtr Callback(int nCode, IntPtr msg, IntPtr s);

        [DllImport("user32.dll")]
        public static extern IntPtr SetWindowsHookEx(int idHook, Callback lpfn, IntPtr hMod, uint dwThreadId);

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

        [DllImport("user32.dll")]
        public static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr msg, IntPtr s);

        [DllImport("user32.dll")]
        [return: MarshalAs(UnmanagedType.Bool)]
        public static extern bool UnhookWindowsHookEx(IntPtr hhk);

        [StructLayout(LayoutKind.Sequential)]
        private struct KeyboardLLHookStruct
        {
            public uint vkCode;
            public uint scanCode;
            public uint flags;
            public uint time;
            public IntPtr dwExtraInfo;
        }

        private static IntPtr KeybordHookProc(int nCode, IntPtr msg, IntPtr s)
        {
            if (nCode < 0)
            {
                return CallNextHookEx(hHook, nCode, msg, s);
            }

            KeyboardLLHookStruct hookStruct = new KeyboardLLHookStruct();

            hookStruct = (KeyboardLLHookStruct)Marshal.PtrToStructure(s, typeof(KeyboardLLHookStruct));

            uint vkCode = hookStruct.vkCode;

            if (msg == new IntPtr(WM_KEYDOWN))
            {
                vkCode = hookStruct.vkCode;
                if (vkCode >= 96 && 111 >= vkCode)
                {
                    wkQueue.Enqueue(vkCode);
                    return new IntPtr(1);
                }
            }

            if (msg == new IntPtr(WM_KEYUP))
            {
                vkCode = hookStruct.vkCode;

                if (vkCode >= 96 && 111 >= vkCode)
                {
                    return new IntPtr(1);
                }
            }

            return CallNextHookEx(hHook, nCode, msg, s);
        }

        public void Dispose()
        {
            Boolean ret = UnhookWindowsHookEx(hHook);
            if (ret.Equals(false))
            {
            }
        }

    }
}