/*

 http://sosal.kr/
 * made by so_Sal
 */



https://gist.github.com/Stasonix/3181083


github에서 그대로 퍼왔습니다.

아래 코드는 후킹한 후에 원래 목적지로 가지 않는다는점...

원한다면 hookProc 함수에서 return (IntPtr)1; 을

CallNextHookEx(hhook, code, (int)wParam, lParam);로 고쳐주시면 됩니다.



using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Text.RegularExpressions;
using System.IO;
using System.Drawing.Imaging;
 
using System.Runtime.InteropServices;
 
 
namespace WFA
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
 
 
// ... { GLOBAL HOOK }
[DllImport("user32.dll")]
static extern IntPtr SetWindowsHookEx(int idHook, LowLevelKeyboardProc callback, IntPtr hInstance, uint threadId);
[DllImport("user32.dll")]
static extern bool UnhookWindowsHookEx(IntPtr hInstance);
[DllImport("user32.dll")]
static extern IntPtr CallNextHookEx(IntPtr idHook, int nCode, int wParam, IntPtr lParam);
[DllImport("kernel32.dll")]
static extern IntPtr LoadLibrary(string lpFileName);
private delegate IntPtr LowLevelKeyboardProc(int nCode, IntPtr wParam, IntPtr lParam);
const int WH_KEYBOARD_LL = 13; // Номер глобального LowLevel-хука на клавиатуру
const int WM_KEYDOWN = 0x100; // Сообщения нажатия клавиши
private LowLevelKeyboardProc _proc = hookProc;
private static IntPtr hhook = IntPtr.Zero;
public void SetHook()
{
IntPtr hInstance = LoadLibrary("User32");
hhook = SetWindowsHookEx(WH_KEYBOARD_LL, _proc, hInstance, 0);
}
public static void UnHook()
{
UnhookWindowsHookEx(hhook);
}
public static IntPtr hookProc(int code, IntPtr wParam, IntPtr lParam)
{
if (code >= 0 && wParam == (IntPtr)WM_KEYDOWN)
{
int vkCode = Marshal.ReadInt32(lParam);
//////ОБРАБОТКА НАЖАТИЯ
if (vkCode.ToString() == "162")
{
MessageBox.Show("You pressed a CTR");
}
return (IntPtr)1;
}
else
return CallNextHookEx(hhook, code, (int)wParam, lParam);
}
private void Form1_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
// убираем хук
UnHook();
}
 
private void Form1_Load(object sender, EventArgs e)
{
// Устанавливаем хук
SetHook();
}
 
 
}
 
}


Posted by sosal sosal

댓글을 달아 주세요

  1. 2018.09.01 23:20 신고

    좋은글 감사합니다! 소스 잘 사용하겠습니다.
    https://blog.naver.com/a16620

  2. 2018.10.17 02:25 신고

    마이크로소프트 블로그에 올려진 것을 저도 수정해서 구현해 봤습니다.
    https://blogs.msdn.microsoft.com/toub/2006/05/03/low-level-keyboard-hook-in-c/

    여기서, 폼이 종료될 때 UnHook() 하지 않고,
    타이머를 이용해서 일정시간 지난 후 UnHook()을 하면
    Hook 이 종료되지 않고 그대로 살아 있습니다.
    혹시, 어떤 원인인지 알 수 있을까요?