Как переместить программную панель ввода (клавиатуру) в нижнюю часть экрана Windows Mobile? - PullRequest
1 голос
/ 23 августа 2011

Я пытаюсь переместить клавиатуру в нижнюю часть экрана, чтобы скрыть строку меню размером 35px, которая отображается по умолчанию в Windows Mobile 5/6. Все примеры, которые я видел об изменении строки меню, касались скрытия кнопки «MS_SIPBUTTON». Две части моего вопроса:

Как мне переместить клавиатуру вниз на 35 пикселей на экране?

И где определяется "MS_SIPBUTTON"?

1 Ответ

1 голос
/ 24 августа 2011

Часть первая:

Лучший способ собрать клавиатуру - это набор вызовов Windows API, на которые ссылается pinvoke.net

Первая группаиз операторов DllImport:

        [DllImport("coredll.dll", SetLastError = true)]
        private static extern IntPtr FindWindow(string caption, string className);

        [DllImport("coredll.dll")]
        [return: MarshalAs(UnmanagedType.Bool)]
        public static extern bool GetWindowRect(IntPtr hwnd, out RECT lpRect);

        [DllImport("coredll.dll")]
        internal static extern void MoveWindow(IntPtr hwnd, int X, int Y, int nWidth, int nHeight, bool bRepaint);

        [DllImport("coredll.dll", SetLastError = true)]
        extern static int SipShowIM(int dwFlag);

Далее некоторые константы и переменные:

        Rectangle sipbutton;
        Rectangle keyboardBackground;
        Rectangle keyboard;

        private const int SW_HIDE = 0;
        private const int SW_SHOW = 1;
        private const int GW_CHILD = 5;
        private const int SIPF_ON = 1;
        private const int SIPF_OFF = 0;

Функции для отображения и скрытия кнопки SIP, отображаемой внизу страницы.Они вызваны в моем конструкторе и деструкторе

            public void HideSip()
            {
                IntPtr hTaskBarWindow = FindWindow("MS_SIPBUTTON", null);
                if (hTaskBarWindow != IntPtr.Zero)
                {
                    RECT rct;

                    if (!GetWindowRect(hTaskBarWindow, out rct))
                    {
                        MessageBox.Show("ERROR");
                        return;
                    }

                    Rectangle myRect = new Rectangle();

                    myRect.X = (int)rct.Left;
                    myRect.Y = (int)rct.Top;
                    myRect.Width = (int)(rct.Right - rct.Left + 1);
                    myRect.Height = (int)(rct.Bottom - rct.Top + 1);

                    //save previous state
                    sipbutton = myRect;

                    MoveWindow(hTaskBarWindow, myRect.X, myRect.Y + 1000, myRect.Width, myRect.Height, true);
                    //MoveWindow(hTaskBarWindow, 100, 100, 100, 100, true);
                }
            }

            public void RestoreSip()
            {
                IntPtr hTaskBarWindow = FindWindow("MS_SIPBUTTON", null);
                if (hTaskBarWindow != IntPtr.Zero && sipbutton.Height > 0 && sipbutton.Width > 0)
                {
                    MoveWindow(hTaskBarWindow, sipbutton.X, sipbutton.Y, sipbutton.Width, sipbutton.Height, true);
                }
            }

. Таким образом, нам нужно переместить клавиатуру вниз к нижней части экрана:

public void MoveKeyboardDown(int pixelsDown)
        {

            IntPtr hSipWindow = FindWindow("SipWndClass",null);
            if (hSipWindow != IntPtr.Zero)
            {
                RECT rct;

                if (!GetWindowRect(hSipWindow, out rct))
                {
                    MessageBox.Show("ERROR");
                    return;
                }

                Rectangle myRect = new Rectangle();

                myRect.X = (int)rct.Left;
                myRect.Y = (int)rct.Top;
                myRect.Width = (int)(rct.Right - rct.Left + 1);
                myRect.Height = (int)(rct.Bottom - rct.Top + 1);

                //save previous state
                keyboard = myRect;

                MoveWindow(hSipWindow, myRect.X, myRect.Y + pixelsDown, myRect.Width, myRect.Height, true);

            }

            IntPtr hSipWindow2 = FindWindow("SipBackDropWndClass",null);
            if (hSipWindow2 != IntPtr.Zero)
            {
                RECT rct;

                if (!GetWindowRect(hSipWindow2, out rct))
                {
                    MessageBox.Show("ERROR");
                    return;
                }

                Rectangle myRect = new Rectangle();

                myRect.X = (int)rct.Left;
                myRect.Y = (int)rct.Top;
                myRect.Width = (int)(rct.Right - rct.Left + 1);
                myRect.Height = (int)(rct.Bottom - rct.Top + 1);

                //save previous state
                keyboardBackground = myRect;

                MoveWindow(hSipWindow2, myRect.X, myRect.Y + pixelsDown, myRect.Width, myRect.Height, true);

            }


            arPages[iCurrentPage].Invalidate();
        }

        public void RestoreKeyboard()
        {

            IntPtr hSipWindow = FindWindow("SipWndClass", null);
            if (hSipWindow != IntPtr.Zero && keyboard.Height > 0 && keyboard.Width > 0)
            {
                MoveWindow(hSipWindow, keyboard.X, keyboard.Y, keyboard.Width, keyboard.Height, true);
            }

            IntPtr hSipWindow2 = FindWindow("SipBackDropWndClass", null);
            if (hSipWindow2 != IntPtr.Zero && keyboardBackground.Height > 0 && keyboardBackground.Width > 0)
            {
                MoveWindow(hSipWindow2, keyboardBackground.X, keyboardBackground.Y, keyboardBackground.Width, keyboardBackground.Height, true);
            }

        }

Когда вы хотитепокажите клавиатуре что-то вроде этого:

    SipShowIM(SIPF_ON);
    MoveKeyboardDown(25);

Когда вы хотите скрыть это, сделайте это:

    SipShowIM(SIPF_OFF);
    RestoreKeyboard();

Часть вторая:

Мне удалось обнаружитьимена окон, упомянутых выше, с помощью CE Remote Tools / Windows CE Remote Spy.Исполняемый файл "ccspy.exe"

...