C# 钥匙扣问题

发布于 2024-08-28 04:59:34 字数 1074 浏览 12 评论 0原文

我从 http://www.codeproject.com/KB/cs/ 复制了以下代码CSLLKeyboardHook.aspx

public int hookProc(int code, int wParam, ref keyboardHookStruct lParam) 
{
    if (code >= 0) 
    {
     Keys key = (Keys)lParam.vkCode;
     if (HookedKeys.Contains(key)) 
        {
         KeyEventArgs kea = new KeyEventArgs(key);
         if((wParam == WM_KEYDOWN || wParam == WM_SYSKEYDOWN) && (KeyDown != null)) 
            {KeyDown(this, kea) ;} 
            else if ((wParam == WM_KEYUP || wParam == WM_SYSKEYUP) && (KeyUp != null)) 
            {KeyUp(this, kea); }
            if (kea.Handled)
            {return 1;}
      }
     }
     lParam.vkCode ++;
     lParam.scanCode ++;
     return CallNextHookEx(hhook, code, wParam, ref lParam);
}

它工作正常,但是当我做了一点更改:

lParam.vkCode ++;
or
lParam.scanCode ++;

在返回 CallNextHookEx(...) 之前,原始键仍然出现在记事本中。 前任。如果我按“a”,我预计记事本中的字母将是“b”,但它仍然是“a”。 看起来“lParam”没有改变。不明白为什么?

I copied the following code from http://www.codeproject.com/KB/cs/CSLLKeyboardHook.aspx,

public int hookProc(int code, int wParam, ref keyboardHookStruct lParam) 
{
    if (code >= 0) 
    {
     Keys key = (Keys)lParam.vkCode;
     if (HookedKeys.Contains(key)) 
        {
         KeyEventArgs kea = new KeyEventArgs(key);
         if((wParam == WM_KEYDOWN || wParam == WM_SYSKEYDOWN) && (KeyDown != null)) 
            {KeyDown(this, kea) ;} 
            else if ((wParam == WM_KEYUP || wParam == WM_SYSKEYUP) && (KeyUp != null)) 
            {KeyUp(this, kea); }
            if (kea.Handled)
            {return 1;}
      }
     }
     lParam.vkCode ++;
     lParam.scanCode ++;
     return CallNextHookEx(hhook, code, wParam, ref lParam);
}

It works fine but when I make a little change:

lParam.vkCode ++;
or
lParam.scanCode ++;

right before the return CallNextHookEx(...), the original keys still appears in Notepad.
Ex. If I press "a", I expect the letter in Notepad will be "b" but it still "a".
It seems like "lParam" doesn't change. Couldn't understand why?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

巴黎夜雨 2024-09-04 04:59:34

值 lParam.vkCode 不是简单的 int 类型,因此我认为您不能以这种方式递增它。

然而,一旦你有了你的关键对象......

Keys key = (Keys)lParam.vkCode;

你应该能够做一些事情,比如获取字节值并递增它。

int keyVal = Encoding.ASCII.GetByte(key.KeyCode);
keyVal++;

我认为 vkCode 不是实际的密钥代码,而可能是一个指针或其他东西,通过将其分配给变量 Key .Net 将该值拉入并通过强制转换将其转换为托管密钥类型。

当然我可能是错的...

The value lParam.vkCode is not a simple int type so I don't think you can increment it in this fashion.

once you have your key object however ...

Keys key = (Keys)lParam.vkCode;

You should be able to do something like get the byte value and increment that.

int keyVal = Encoding.ASCII.GetByte(key.KeyCode);
keyVal++;

I think vkCode is not the actual key code but maybe a pointer or something, by assigning it to the variable Key .Net pulls that value in and with your cast translates it to the managed key type.

Of course i could be wrong ...

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文