freedom_wings4 2016-08-15 08:18 采纳率: 0%
浏览 1657

c#,winform,接收message,按下了w键,却没收到WM_KEYDOWN和WM_KEYUP

窗体布局
图片说明

代码大概就是,导入了自己写的会hook所有线程的按键,并把按键信息以Message的形式发来这个窗体dll,按button1就是开始hook,button2停止hook,button3按照一定的格式把收到的Message的WParam属性的值显示出来。
部分代码如下

 const int WM_CHAR = 0x102;
const int WM_UNICHAR = 0X109;

const int VK_SHIFT = 16;
const int VK_CAPITAI = 20;

char[] ascii=new char[26]{'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};

[DllImport(@"User32.dll")]
protected static extern short GetKeyState(int nVirtualKey);

protected override void WndProc(ref Message m)
    {
        bool IsRecord = true;
        int a = (int)m.WParam;
        if (a >= 65 && a <= 90)
        {
             Console.WriteLine("the m.Msg is : " + m.Msg + " \n");
             if (GetKeyState(VK_SHIFT) < 0 || (GetKeyState(VK_CAPITAI) != 0 ? true : false))
             {
                char c = ascii[a - 65];
                char d = (char)(c - 32);
                str = str + "the button you press is: " + d + " \n";
              }
              else str = str + "the button you press is: " + ascii[a - 65] + " \n";
      }

          base.WndProc(ref m);
    }

然后我只按下一次"w"键,如下图
图片说明

图片说明

上图这是后台输出,代码中有,但是收到的信息的id为0和3,即是WM_NULL和WM_MOVE,却不是收到WM_KEYDOWN和WM_KEYUP,但是此信息的WParam属性又是准确对应了键码,这是怎么回事?

  • 写回答

1条回答 默认 最新

  • threenewbee 2016-08-15 15:48
    关注

    keypreview属性设置了么?onkeypress重写了么?

    评论

报告相同问题?

悬赏问题

  • ¥15 #MATLAB仿真#车辆换道路径规划
  • ¥15 java 操作 elasticsearch 8.1 实现 索引的重建
  • ¥15 数据可视化Python
  • ¥15 要给毕业设计添加扫码登录的功能!!有偿
  • ¥15 kafka 分区副本增加会导致消息丢失或者不可用吗?
  • ¥15 微信公众号自制会员卡没有收款渠道啊
  • ¥100 Jenkins自动化部署—悬赏100元
  • ¥15 关于#python#的问题:求帮写python代码
  • ¥20 MATLAB画图图形出现上下震荡的线条
  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘