سؤال

أحاول استخدام PostMessage لإرسال مفتاح TAB.

ها هو رمزتي:

// This class allows us to send a tab key when the the enter key
//  is pressed for the mooseworks mask control.   
public class MaskKeyControl : MaskedEdit
{
//  [DllImport("coredll.dll", SetLastError = true, CharSet = CharSet.Auto)]
//  static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, Int32 wParam, Int32 lParam);

    [return: MarshalAs(UnmanagedType.Bool)]
    // I am calling this on a Windows Mobile device so the dll is coredll.dll
    [DllImport("coredll.dll", SetLastError = true)]
    static extern bool PostMessage(IntPtr hWnd, uint Msg, Int32 wParam, Int32 lParam);

    public const Int32 VK_TAB = 0x09;
    public const Int32 WM_KEYDOWN = 0x100;

    protected override void OnKeyDown(KeyEventArgs e)
    {
        if (e.KeyData == Keys.Enter)
        {
            PostMessage(this.Handle, WM_KEYDOWN, VK_TAB, 0);
            return;
        }
        base.OnKeyDown(e);
    }

    protected override void OnKeyPress(KeyPressEventArgs e)
    {
        if (e.KeyChar == '\r') 
            e.Handled = true;
        base.OnKeyPress(e);
    }
}

عندما أضغط على إدخال الكود يتم استدعاؤه ، لكن لا شيء يحدث. ثم أضغط على علامة التبويب ويعمل بشكل جيد. (لذلك هناك خطأ ما في إرسال رسالة علامة التبويب الخاصة بي.)

هل كانت مفيدة؟

المحلول

لا ينبغي عليك حقًا نشر رسائل Windows المتعلقة بإدخال المستخدم مباشرة بعناصر التحكم Windows. بدلاً من ذلك ، إذا كنت ترغب في محاكاة الإدخال ، فيجب عليك الاعتماد على SendInput API وظيفة بدلا من ذلك لإرسال مكابس المفتاح.

أيضا ، كما يذكر كريس تايلور في تعليقه ، فئة Sendkeys يمكن استخدامها لإرسال مدخلات المفاتيح إلى تطبيق ما في حالة تريد استخدام غلاف موجود موجود (بدلاً من استدعاء وظيفة SendInput بنفسك من خلال طبقة P/Invoke).

نصائح أخرى

ما بعد الأحداث الرئيسية في الأحداث الرئيسية لا أشياء غريبة حقا.

في هذه الحالة ، ربما يعمل SendMessage باستخدام KeyDown و Keypress و Keyup (ثلاث مكالمات) بشكل أفضل.

بديل لإرسال رسائل الإدخال إلى عنصر التحكم ، فقد تكون أكثر وضوحًا وتفعل ما يلي.

protected override void OnKeyDown(KeyEventArgs e)
{
  if (e.KeyCode == Keys.Enter)
  {
    if (Parent != null)
    {
      Control nextControl = Parent.GetNextControl(this, true);
      if (nextControl != null)
      {
        nextControl.Focus();
        return;
      }
    }
  }
  base.OnKeyDown(e);
}

سيؤدي ذلك إلى ضبط التركيز على عنصر التحكم التالي على الوالد عند الضغط على مفتاح Enter.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top