テンキー押下でWin32アプリのウインドウをキャプチャする。ただしUWPアプリはキャプチャできない。
Rev. | 95 |
---|---|
크기 | 3,528 bytes |
Time | 2018-03-05 12:48:44 |
Author | hor931101jp |
Log Message | (empty log message) |
/***********************************************************//*!
* @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))
{
}
}
}
}