以编程方式取消C#中的键盘命令

我想用VSTO编写一个钩子到MS Excel,而且我真的很接近我需要的东西,但我有一个小问题。

我用低级的WINAPI调用来获取键盘事件,并检查键击(效果很好)。

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] private static extern IntPtr SetWindowsHookEx(int idHook, KeyCaptureDelegate lpfn, IntPtr hMod, uint dwThreadId); [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam); private static IntPtr KeyCaptureCallback(int nCode, IntPtr wParam, IntPtr lParam) { if (nCode >= 0) { int pointerCode = Marshal.ReadInt32(lParam); bool result = false; if (wParam == (IntPtr)WM_KEYDOWN) { if (KeyDown != null) { result = KeyDown(pointerCode); } } //if (result) //return IntPtr.Zero; } return CallNextHookEx(_keyCaptureHook, nCode, wParam, lParam); } 

一切都很好(使用SetWindowsHookEx),我的代码通过KeyDown调用没有任何问题。 唯一的问题是,我试图覆盖Excel中的默认命令,即Ctrl + Shift + 1。 这会导致默认function发生。

在我的代码中,结果返回是否应该覆盖行为(即使用我的新行为,而不是默认值)。 也许我曾经希望,返回的IntPtr.Zero会打破并从泵上取下钥匙,但这似乎什么也没有做。

有没有办法阻止其他(默认)行为? 我会想象,通过取消/处理事件(就像我们可以在WinForms / WPF中),应该有一些方法来防止关键笔划进一步迁移到Excel中。 有什么想法吗?

所以,我需要做一些小的改变:

  private delegate IntPtr KeyCaptureDelegate(int nCode, IntPtr wParam, IntPtr lParam); 

成为:

  private delegate int KeyCaptureDelegate(int nCode, IntPtr wParam, IntPtr lParam); 

  [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam); 

成为:

  [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] private static extern int CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam); 

这让我把它改写为:

  private static int KeyCaptureCallback(int nCode, IntPtr wParam, IntPtr lParam) { if (nCode >= 0) { int pointerCode = Marshal.ReadInt32(lParam); bool result = false; if (wParam == (IntPtr)WM_KEYDOWN) { if (KeyDown != null) { result = KeyDown(pointerCode); } } if (result) { return 1; } } return CallNextHookEx(_keyCaptureHook, nCode, wParam, lParam); }