Как скрыть маленькое всплывающее окно с клавиатурой в Windows Mobile 6.5?(C #) - PullRequest
2 голосов
/ 03 сентября 2011

У меня есть приложение, которое по сути является мастером, который проходит через некоторые диалоговые окна.На одной из форм есть только кнопка, которая вызывает общее диалоговое окно «сделать снимок».

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

Я попытался установить закрытое окно на фронт, вызвав:

nextButton.BringToFront();

Но это не имеет никакого эффекта.Мне нужно как-то отключить маленький значок клавиатуры и не знать, как это сделать.

Примечание. Это не программная клавиатура, а изображение, которое пользователь нажимает, чтобы вызвать это.

Примечание - в этой форме нет текстовых элементов управления - есть только 4 кнопки - одна, которая запускает CameraCaptureDialog, и несколько других, которые управляют переходом пользователя на «следующий» и «предыдущий» экраны.

РЕДАКТИРОВАТЬ

Учитывая, что два человека были очень уверены, что их код будет работать, и, глядя на ссылки в Интернете, я понял, что они могут быть правы. Я подумал, что я подробно остановлюсь на этом вопросе, поскольку ни одно из предложений не решит проблему.

Элемент клавиатуры, кажется, остается остатком после того, как я выбираю кнопку «Отмена» или «OK» в меню «сделать снимок» /CameraCaptureDialog.

При выходе из диалогового окна, кажется, есть середина /пункт меню клавиатуры остался, и я ничего не могу с этим поделать.

Вот как это выглядит вэмулятор (также происходит в эмуляторе) enter image description here

Примечание. Вызов всех нижеуказанных элементов не влияет на значок клавиатуры, скрывающий кнопку:

// nextButton is the Button on the control hidden by the keyboard icon thingy
nextButton.Focus();
nextButton.BringToFront();
nextButton.Invalidate();
nextButton.Refresh();
nextButton.Show();

Ответы [ 3 ]

5 голосов
/ 05 сентября 2011

Я также искал решение, чтобы скрыть маленький значок клавиатуры (значок SIP), и я достиг этого, используя функции FindWindowW и MoveWindow или SetWindowPos coredll.dll и user32.dll

Объявите интересующую нас функцию:

    [DllImport("coredll.dll", EntryPoint = "FindWindowW", SetLastError = true)]
    private static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

    [DllImport("coredll.dll", SetLastError = true)]
    [return: MarshalAs(UnmanagedType.Bool)]
    private static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int x, int y, int cx, int cy, uint uFlags);

Затем найдите маркер для значка клавиатуры и вызовите SetWindowPos, чтобы скрыть его:

IntPtr hWnd = FindWindow(Nothing, "MS_SIPBUTTON");
SetWindowPos(hWnd, 1, 0, 0, 0, 0, &H80);

Полезные ссылки:

  1. P / Invoke - coredll.dll
  2. Отключить значок клавиатуры в Windows Mobile с помощью VB.net
  3. Управление SIP - перейдите к нижней части этого поста и найдите комментарии имени пользователя Mark

EDIT

Мне пришлось немного изменить это для компиляции.

    const int SWP_HIDE = 0x0080;
    IntPtr hWnd = FindWindow(null, "MS_SIPBUTTON");
    SetWindowPos(hWnd, IntPtr.Zero, 0, 0, 0, 0, SWP_HIDE);
1 голос
/ 07 марта 2014

Этот ответ был взят из следующей статьи http://beemobile4.net/support/technical-articles/windows-mobile-programming-tricks-on-net-compact-framework-12 (я только добавил операторы использования).Я на Windows Mobile 6.1 Classic, .NET CF 3.5.

using System;
using System.Runtime.InteropServices;

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

[DllImport("coredll.dll", SetLastError = true)]
private static extern bool ShowWindow(IntPtr hwnd, int state);

[DllImport("coredll.dll")]
private static extern IntPtr GetWindow(IntPtr hWnd, uint uCmd);

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

///         
/// Shows the SIP (Software Input Panel) button.        
///
static public void ShowHideSIP(int nShowOrHide)
{
    IntPtr hSipWindow = FindWindow("MS_SIPBUTTON", "MS_SIPBUTTON");
    if (hSipWindow != IntPtr.Zero)
    {
        IntPtr hSipButton = GetWindow(hSipWindow, GW_CHILD);
        if (hSipButton != IntPtr.Zero)
        {
            bool res = ShowWindow(hSipButton, nShowOrHide);
        }
    }
}
1 голос
/ 05 сентября 2011
[DllImport("coredll.dll", EntryPoint = "SipShowIM")]
public static extern bool SipShowIMP(int code);

SipShowIMP(1); //Show the keyboard

SipShowIMP(0); //Hide the keyboard

Это должно сделать это: -)

...