2

这是一个主观问题,但我需要意见。

我有一个 WinForms C# 应用程序,其窗口在特定击键(Enter 或 Escape)后隐藏,并带有可能的修饰符(例如 Ctrl-Enter)。当隐藏在 KeyDown 或 KeyPress 上时,在我的窗口隐藏后变为活动状态的其他应用程序会收到该击键的 KeyUp 事件。通常,它不应该影响其他应用程序,但其中一些对 KeyUp 有反应。例如,TweetDeck 在“Enter”KeyUp 上发送当前正在编辑的消息,即使它没有收到 KeyDown/KeyPress。

所以我想,好吧,我会成为一个好公民,我会躲在 KeyUp 上。但这感觉不对。如果我只寻找钥匙,我正在做我责怪别人做的事情!如果我尝试创建匹配 KeyDown/KeyUp 的历史记录,那么我的代码过于复杂(修饰符会生成自己的密钥)。

我该怎么办?一个执行良好的应用程序应该做什么?

4

3 回答 3

2

这是一个 hack,但您可以在收到按键时将程序的状态设置为“等待隐藏”。然后,当您为该序列准备好密钥时,重置“待定状态”,然后隐藏。

或者,您可以在收到密钥后将密钥从消息队列中“吃掉”吗?

我不会太担心应用程序处理按键而不是按键 - 正如您所指出的那样 - 这是一个问题的唯一原因是因为您的应用程序在按键序列的中间更改了活动窗口。您也有责任(IMO)“吃掉”关键信息。您可以只处理向上键而不是向下键,而不会产生不利的副作用。

编辑

进一步考虑这一点 - 当执行 alt-tab 转到新窗口时 - 直到按键才会发生该操作。与此同时,它显示了一个可能要更改的应用程序的窗口。你可以做类似的动作并且这种行为是有先例的。

所以: On key down:显示窗口,表明应用程序将隐藏。上键:隐藏窗口

这是“有状态的”——只有当你收到钥匙放下和钥匙向上时,你才能隐藏起来——至少我会这样做。99.9999%(猜想)不处理按键是可以的。

于 2008-11-17T19:06:37.963 回答
1

我想不出任何在 KeyUp 事件上实现键盘快捷键的程序。该标准是很久以前使用 Windows TranslateAccelerator() API 函数设定的。它翻译 WM_KEYDOWN。Windows 窗体使用 ProcessCmdKey() 实现相同的行为。

听起来你发现了一个笨蛋。它是否正确处理 Alt+F4?

于 2008-11-17T19:24:21.640 回答
-1

好吧,我会说“别担心,直到它成为一个问题”,但我想它现在是一个问题......

在这种情况下,我会隐藏在 KeyPress 上(预期的用户体验),但要抓住焦点,直到您获得 KeyUp(或直到短暂的超时)。

于 2008-11-17T19:08:19.490 回答