2008-11-17 16 views
1

這是一個主觀問題,但我需要意見。對於在按鍵時隱藏自身的窗口,預期行爲是什麼

我有一個WinForms C#應用程序,它的窗口通過特定的按鍵(Enter或Escape)和可能的修飾符(例如Ctrl-Enter)隱藏自己。隱藏在KeyDown或KeyPress上時,在我的窗口隱藏自身後變爲活動狀態的另一個應用程序會接收該按鍵的KeyUp事件。通常情況下,它不應該影響其他應用程序,但其中一些應用程序會對KeyUp做出反應。例如,即使TweetDeck沒有收到KeyDown/KeyPress,TweetDeck也會在「Enter」KeyUp上發送當前正在編輯的消息。

所以我想,很好,我會成爲一個好公民,我會隱藏在KeyUp上。但是這並不正確。如果我只是尋找鑰匙,我正在做我責怪別人的事情!如果我嘗試創建一個匹配KeyDown/KeyUp的歷史記錄,我會過度複雜化我的代碼(修飾符會自己生成密鑰)。

我該怎麼辦?實施良好的應用程序應該做什麼?

回答

0

我想不出任何在KeyUp事件上實現鍵盤快捷鍵的程序。該標準很早以前就由Windows TranslateAccelerator()API函數設置。它翻譯WM_KEYDOWN。 Windows Forms通過ProcessCmdKey()實現相同的行爲。

聽起來像你發現了一個doozy。它是否正確處理Alt + F4?

2

這是一種黑客攻擊,但您可以在收到密鑰時將程序的狀態設置爲「等待隱藏」。然後,當您獲取該序列的關鍵字時,請重置「等待狀態」,然後隱藏。

或者,您可以在接收到關鍵字後「關閉」消息隊列中的密鑰嗎?

我不會過分擔心應用程序處理鍵而不是按鍵 - 就像您指出的那樣 - 這是一個問題的唯一原因是因爲您的應用程序在按鍵向上鍵順序中更改了活動窗口。您也有責任(IMO)「吃」關鍵信息。你可能只是處理鑰匙而不是鑰匙而沒有不良副作用。

編輯

這個進一步的思考 - 做ALT標籤去一個新的窗口時 - 動作不會發生,直到關鍵的。與此同時,它顯示了一個可以改變的應用程序窗口。你可以採取類似的行動,這種行爲有先例。

因此: 關鍵:顯示窗口,指示應用程序將隱藏。 關鍵:隱藏窗口

這是「有狀態的」 - 只有在您收到鑰匙和鑰匙時才能進入隱藏狀態 - 至少我會這樣做。 99.9999%(猜)不處理按鍵就沒關係。

+0

但是,如果用戶按下該鍵並將其按住一秒鐘,該怎麼辦?如果它不隱藏在KeyDown上,他會感到困惑。如果KeyUp不在那裏,你還想吃什麼? – 2008-11-17 19:10:45

+0

你什麼都不做。其他解決方案將不會採取行動,直到關鍵要麼... – Tim 2008-11-17 19:12:59

+0

您的解決方案有類似的相同問題...應用程序隱藏,但沒有發生,直到鑰匙被釋放。正如我提出的答案 - 這是一個黑客攻擊。 – Tim 2008-11-17 19:14:15

-1

嗯,我會說:「別擔心,直到它成爲一個問題」,但我想這是一個問題,現在....

在這種情況下,我會隱藏按鍵響應(預期的用戶體驗),但抓住焦點直到獲得KeyUp(或直到短暫超時)。