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
相关产品推荐
相关产品推荐

