You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WinForms调用Keyboard.GetKeyStates后窗口尺寸缩小是BUG还是其他原因?

问题原因
  • Keyboard.GetKeyStates属于WPF框架的输入API,并非WinForms原生提供的接口。在WinForms项目中调用该API时,会自动触发WPF运行时的初始化逻辑。
  • WPF运行时默认会强制开启进程的高DPI感知属性,若你的WinForms项目未提前在配置中显式声明高DPI兼容,进程的DPI适配模式会从默认的DPI虚拟化切换为高DPI感知模式,系统会直接按照物理像素计算窗体尺寸,最终表现为窗体整体异常缩小,和按键检测逻辑本身没有直接关联。
  • 你当前的按键检测代码写法不规范,不应该硬编码1、3这类魔数判断按键状态,正确的位运算判断方式如下:
if ((Keyboard.GetKeyStates(Key.LeftCtrl) & KeyStates.Down) != 0)
{
    Console.WriteLine("pressed");
}

是否为框架BUG

不属于框架BUG,是跨框架调用API触发的进程配置变更,属于API使用场景不当导致的问题。

修复方案

如果仅需要在WinForms项目中检测按键状态,优先使用WinForms原生接口,避免引入WPF运行时导致不必要的配置变更:

// WinForms原生检测Ctrl按键按下的方案
if ((Control.ModifierKeys & Keys.Control) == Keys.Control)
{
    Console.WriteLine("pressed");
}

如果确实需要保留WPF相关API的调用,只需在项目的app.manifest文件中显式声明高DPI兼容配置,即可避免运行时DPI模式切换导致的窗体缩放异常。

内容的提问来源于stack exchange,提问作者PH Mohmmed Alaa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 12:06:06