Корейская виртуальная клавиатура отключает WM_IME_ENDCOMPOSITION по щелчку мыши - PullRequest
1 голос
/ 21 февраля 2012

Я имею дело с точно такой же ситуацией, как и Этот вопрос .

Ответов не было, и вопрос был слишком старым, поэтому я не мог оставлять комментарии, видя, нашел ли ОП решение.

Я только сейчас изучаю основы p / invoke и, по крайней мере, не понимаю этого.

Я довольно много искал. Я нашел Этот вопрос , который связал меня с Этот вопрос / ответ , но я все еще не в состоянии понять, что мне нужно сделать.

Полагаю, я прошу способ манипулировать командами WM_IME или, по крайней мере, отключить WM_IME_ENDCOMPOSITION при щелчках мыши.

Заранее спасибо

Ответы [ 2 ]

1 голос
/ 21 февраля 2012

Нет эксперта по IME, но не могли бы вы просто переопределить «WndProc», но не пропустить «сообщение», поскольку оно мешало другим приложениям / элементам управления обрабатывать его?WndProc захватывает сотни «сообщений Windows», которые генерируются операционной системой и могут быть перехвачены «слушающим», один из подходов состоит в том, чтобы выборочно игнорировать это сообщение при правильных условиях ...

protected override void WndProc(ref Message m)
  {
    switch(m.Msg)
    {
      case WM_IME_ENDCOMPOSITION :
        // Gobble this up or ignore
        break;
      default:
        // Continue as normal
        base.WndProc (ref m);
        break;
    }
  }

Например, если вы имеете дело с элементом управления, вы можете переопределить WndProc для элемента управления, перехватить событие мыши (или WM_MOUSEDOWN), установить переменную, чтобы игнорировать WM_IME_ENDCOMPOSITION, а затем снова включить эту переменную при наведении мыши.(или WM_MOUSEUP)?В качестве альтернативы вы можете использовать MouseHook , но это может быть немного излишним ...

0 голосов
/ 22 февраля 2012

То, что я в итоге сделал, поскольку WM_IME_ENDCOMPOSITION, по-видимому, не запускалось, я вместо этого попытался отключить mouseactivate winproc.

        private const int WM_MOUSEACTIVATE = 0x0021;
        private const int MA_NOACTIVATEANDEAT = 0x0004;

        protected override void WndProc(ref Message m)
        {
            if (mousestatus == 0)
            {
                if (m.Msg == WM_MOUSEACTIVATE)
                {
                    m.Result = (IntPtr)MA_NOACTIVATEANDEAT;
                    return;
                }
                base.WndProc(ref m);
            }
        }

, а затем изменил все обработчики событий щелчка панели на события мыши.Поскольку в некоторых частях приложения требовалось щелкать мышью, я добавил переменную mousestatus, чтобы щелчки мыши были отключены только при нулевом значении mousestatus.Это было определено положением мыши (как и при отключенных щелчках мыши, я не смог бы ничего щелкнуть, чтобы включить его).

    [System.Runtime.InteropServices.DllImport("user32.dll")]
    public static extern void mouse_event(int dwFlags, int dx, int dy, int cButtons, int dwExtraInfo);

    private void timer1_Tick(object sender, EventArgs e)
    {
        if ((Cursor.Position.X - Location.X) >= 904 && (Cursor.Position.X - Location.X) <= 963 && (Cursor.Position.Y - Location.Y) >= 145 && (Cursor.Position.Y - Location.Y) <= 167)
        {
            mousestatus = 1;

            mouse_event(MOUSEEVENTF_LEFTDOWN, Cursor.Position.X, Cursor.Position.Y, 0, 0);
            mouse_event(MOUSEEVENTF_LEFTUP, Cursor.Position.X, Cursor.Position.Y, 0, 0);


            timer4.Start();

        }
    }

Я был почти уверен, что щелчок произойдет раньше, чем mousestatus = 1было определено, поэтому, чтобы убедиться, что нужное место было щелкнуто, я вставил виртуальный щелчок мышью.timer4 был просто таймером, который устанавливал mousestatus обратно на 0.

Код может быть немного грязным, и я уверен, что есть некоторые ярлыки, которые я мог бы использовать, но на данный момент он работает для чегоЯ нуждаюсь.= D

...