1

複数のプロジェクト ソリューションがあり、そのソリューションのすべてのプロジェクトで共通のサービス キーストロークが必要です。
たとえば、含まれているプロジェクトのいずれかでいつでもどこでも Ctrl+Alt+Right Shift を押すと、実際に「何か」が発生し、そのキーストロークをすぐに検出できます。

これらすべてのプロジェクトについて、「common.dll」への参照として他のすべてのプロジェクトに含まれる追加プロジェクトに共通コードがあるため、このコードを配置するのに適切な場所になる可能性があります。

そのタスクを作成する方法と、そのコードがどのように見えるべきかについてのアイデアはありますか?

PreFilter Messageでこれらのキーストロークを検出することを考えていますが、助けがなければそれを行うことはできません。
たぶん、私が考えるよりも別の種類のソリューションの方が優れているのでしょうか?

4

2 に答える 2

1

Windows フォームはキーボード イベントを発生させるため、ウィンドウ メッセージを自分で処理するような低レベルの操作を行う必要はありません。複数のフォームとプロジェクトでアプローチを標準化するには、共通の DLL プロジェクトを作成し、他のすべてのプロジェクトでそのプロジェクトへの参照を追加します。以下のコードの行に沿って、共通プロジェクトに静的クラス (VB のモジュール) を作成します。

Imports System.Windows.Forms

Public Module KeyPressHandler

    ''' <summary>
    ''' Connects the <see cref="Form.KeyDown"/> event handler for a specified Windows form
    ''' </summary>
    Public Sub ConnectKeyHandler(form As Form)
        AddHandler form.KeyDown, New KeyEventHandler(AddressOf KeyPressHandler.KeyDownHandler)
    End Sub

    ''' <summary>
    ''' Handles the KeyDown event for a windows form
    ''' </summary>
     Private Sub KeyDownHandler(sender As Object, e As KeyEventArgs)
       If (e.KeyData.HasFlag(Keys.Control) AndAlso e.KeyData.HasFlag(Keys.Alt) AndAlso e.KeyData.HasFlag(Keys.Shift)) Then
            '' Do whatever you want here
        End If
    End Sub

End Module

次に、各フォームのコード ビハインドで、コンストラクターに次のコード行を追加します。

Common.KeyPressHandler.ConnectKeyHandler(Me)

(したがって、最終的には次のようになります):

Public Class Form1

    Public Sub New()

        ' This call is required by the designer.
        InitializeComponent()

        ' Add any initialization after the InitializeComponent() call.
        Common.KeyPressHandler.ConnectKeyHandler(Me)

   End Sub

End Class

列挙型のHasFlagメソッドは .NET 4 で追加されたため、それ以前のバージョンを使用している場合、ロジックはもう少し長くなります。

If ((e.KeyData And Keys.Control = Keys.Control) AndAlso (e.KeyData And Keys.Alt = Keys.Alt) AndAlso (e.KeyData And Keys.Shift = Keys.Shift)) Then

任意のシフト キーではなく、右シフト キーを明確に検出することにはまだ問題があります。RShiftを使用することになっているように見えましたが、左シフトキーと区別する有効な方法を見つけることができませんでした。1 つの解決策は、VK_RSHIFT 定数を使用して Windows API 関数 GetKeyState ( http://www.pinvoke.net/default.aspx/user32.getkeystateを参照) を呼び出すことです。これの歴史的な理由は、左シフト キーと右シフト キーの区別が、未分化のシフト キーよりも後で Windows に追加されたことに関係していると思われます。

于 2013-08-16T12:06:49.910 に答える