2

ハードウェアの[戻る]ボタンが特定のアクションを実行する状況がありますが、このアクションは、SIPコントロールの[戻る]ボタンを使用した場合にもトリガーされます。

KeyPressEventArgがSIPからのものであるかどうかを判断する方法はありますか?

    /// <summary>
    /// Handles the Enter button being pressed as navigation to complete the signature capture
    /// </summary>
    /// <param name="e">The key event args to quaify what button was pressed.</param>
    public override void HandleKeyPress(KeyPressEventArgs e)
    {
        if (e.KeyChar == '\r') // and is not SIP '\r'
        {
            // need to handle only hard button not SIP
        }
    }

これについての啓蒙に感謝します

4

2 に答える 2

2

実験の別の日の後、私はハードボタンのキーの押下からSIP(InputPanel)のキーの押下を示す安定した方法を見つけました。

を使用PeekMessageして、メッセージキューのキー値を確認しLParam、SIPから(すべてのデバイスで)送信されるときに常に1のように見える「1」を確認できます。

以下のコード

public class InputHelper
{
    #region Static Members

    /// <summary>
    /// Determines whether the key value pressed originated from the SIP
    /// </summary>
    /// <param name="keyValue">The key value.</param>
    /// <param name="handle">The widget handle.</param>
    /// <returns>
    ///   <c>true</c> if is sip key press; otherwise, <c>false</c>.
    /// </returns>
    public static bool IsSipKeyPress(int keyValue, IntPtr handle)
    {
        NativeMessage m;
        if (PeekMessage(out m, handle, 0, 0, PM_NOREMOVE))
        {
            // All SIP inputs have LParam of 1, so ignore these
            if (m.msg == WM_CHAR && m.wParam == (IntPtr)keyValue && m.lParam == (IntPtr)1)
            {
                return true;
            }
        }
        return false;
    }

    #endregion


    #region P-Invoke

    const uint PM_NOREMOVE = 0x0000;
    const uint WM_CHAR = 258;

    [DllImport("coredll.dll")]
    [return: MarshalAs(UnmanagedType.Bool)]
    static extern bool PeekMessage(out NativeMessage lpMsg, IntPtr hWnd, uint wMsgFilterMin, uint wMsgFilterMax, uint wRemoveMsg);

    [StructLayout(LayoutKind.Sequential)]
    public struct NativeMessage
    {
        public IntPtr handle;
        public uint msg;
        public IntPtr wParam;
        public IntPtr lParam;
        public uint time;
        public System.Drawing.Point p;
    }

    #endregion
}

使用法:

/// <summary>
/// Handle a KeyDown event and check for Hardbutton Return key
/// </summary>
/// <param name="e">A KeyEventArgs instance</param>
public override void HandleKeyDown(KeyEventArgs e)
{
    if (e.KeyValue == 13)
    {
        if (!InputHelper.IsSipKeyPress(13, base.Handle))
        {
            CompleteProcess();
        }
    }
    base.HandleKeyDown(e);
}  

これが他の誰かに役立つことを願っています:)

于 2012-12-11T04:20:28.290 に答える
2

わかりました、これを行う方法を見つけましたが、これはすべてのデバイスタイプで互換性があるとは限りません.

        public void WndProc(ref Microsoft.WindowsCE.Forms.Message m)
        {
            if (m.Msg == WM_KEYDOWN && (m.WParam == (IntPtr)VK_RETURN && m.LParam != (IntPtr)1))
            {
                 //Handle hard button
            }
        }

LParamSIP からの場合、キープレスの は常に「1」のようです。私はすべてのデバイスタイプでテストを続けます

誰かがこれのためのより良い方法を持っている場合は、以下に投稿してください:)

于 2012-12-10T02:40:29.723 に答える