我正在編寫一個需要獲取系統輸入語言的應用程序,而應用程序窗口是沒有關注。輸入語言鉤子
在搜索Google後,我發現執行此操作的方法是掛鉤WM_INPUTLANGCHANGE
消息。
但我找不到鉤子的語法示例。
我發現下面的代碼,並試圖修改它以適應我的需要,但我失敗了:
編輯: 我已經取代WM_KEYUP與WM_INPUTLANGCHANGE但它沒有工作。
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Windows.Forms;
namespace KeyHook
{
class LenHook
{
private const int WM_INPUTLANGCHANGE = 0x0051;
private static LowLevelKeyboardProc _proc = HookCallback;
private static IntPtr _hookID = IntPtr.Zero;
[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)]
public static extern bool UnhookWindowsHookEx(IntPtr hhk);
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam);
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern IntPtr GetModuleHandle(string lpModuleName);
private delegate IntPtr LowLevelKeyboardProc(int nCode, IntPtr wParam, IntPtr lParam);
public LenHook()
{
_hookID = SetHook(_proc);
UnhookWindowsHookEx(_hookID);
System.Windows.Forms.Application.Run();
}
//Install hook
private static IntPtr SetHook(LowLevelKeyboardProc proc)
{
using (var curProcess = Process.GetCurrentProcess())
{
using (var curModule = curProcess.MainModule)
{
return SetWindowsHookEx(WM_INPUTLANGCHANGE, proc, GetModuleHandle(curModule.ModuleName), 0);
}
}
}
//Do it when key press
private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)
{
MessageBox.Show(wParam.ToString());
return CallNextHookEx(_hookID, nCode, wParam, lParam);
}
}
}
這實際上是你使用的代碼嗎?它看起來像你在鉤它,然後立即解開它。 – 2011-05-27 16:46:33
你失敗了什麼?請描述您期望看到的行爲,以及您在上述代碼中看到的行爲。 – 2011-05-27 16:46:42
是這個班的作品。這段代碼返回被按下的鍵。但是我試圖在系統語言發生變化時使它適應返回消息 – Sergey1991 2011-05-27 16:50:54