C#アプリケーションでは、コンテキストメニューを表示したいのですが、コンテキストメニューを開いたときにShiftキーが押されている場合は、メニューに特別なオプションを追加します。
現在、GetKeyState
APIを使用してShiftキーをチェックしています。私のコンピューターでは正常に動作しますが、英語以外のWindowsを使用しているユーザーは、まったく動作しないと言います。
また、コンテキストメニューが開かれたときにWin32 APIで、メニューにEXTENDEDVERBS
を表示する必要があることを示すフラグがあることも読みました。 C#では、EventArgs
イベントのOpening
には、EXTENDEDVERBS
を示すプロパティが含まれていないか、修飾キーが押されているかどうかがわかりません。
「Opening
」イベント内で現在使用しているコードは次のとおりです。
// SHIFT KEY is being held down
if (Convert.ToBoolean(GetKeyState(0x10) & 0x1000))
{
_menuStrip.Items.Add(new ToolStripSeparator());
ToolStripMenuItem log = new ToolStripMenuItem("Enable Debug Logging");
log.Click += new EventHandler(log_Click);
log.Checked = Settings.Setting.EnableDebugLogging;
_menuStrip.Items.Add(log);
}
GetKeyStateが適切な方法である場合、コードはShiftキーが押されていることを適切に検出しますか?
コントロールで ModifierKeys静的プロパティ を使用して、Shiftキーが保持されているかどうかを判断できます。
if (Control.ModifierKeys == Keys.Shift ) {
...
}
ただし、これはフラグスタイルの列挙型なので、状況に応じて、より厳密なテストを行うことができます。
また、値を確認するときにShiftキーが押されているかどうかを確認することに注意してください。メニューを開いた瞬間ではありません。これはアプリケーションにとって大きな違いではないかもしれませんが、注目に値します。
これを使用して、Shiftキーが押されているかどうかを検出します。
if ((Control.ModifierKeys & Keys.Shift) == Keys.Shift)
実際にはそれよりもずっと簡単です
if( Keyboard.IsKeyDown(Key.LeftCtrl) ||
Keyboard.IsKeyDown(Key.RightCtrl) ||
Keyboard.IsKeyDown(Key.LeftAlt) ||
Keyboard.IsKeyDown(Key.RightAlt) ||
Keyboard.IsKeyDown(Key.LeftShift) ||
Keyboard.IsKeyDown(Key.RightShift))
{
/** do something */
}
プロジェクトがPresentationCoreとWindowsBaseを参照していることを確認してください
Silverlightでは、少なくとも最新バージョンでは、以下を使用する必要があります。
if(Keyboard.Modifiers == ModifierKeys.Shift) {
...
}
Keyboard.Modifiers
は、実際のWPFプロジェクトでも動作します!
また、Keyboard.GetKeyStates
は、後者がトリガーを使用し、実際のキー状態を反映しない場合があるためです。
また、これは次の場合にのみトリガーされることに注意してください。 shift 修飾キーが押されており、他に何もない:
if(Keyboard.Modifiers == ModifierKeys.Shift)
{ ... }
単に検出したい場合 shift キーが押されている場合、別の修飾キーが押されているかどうかにかかわらず、これを使用します。
if((Keyboard.Modifiers & ModifierKeys.Shift) == ModifierKeys.Shift)
{ ... }