Программное управление Windows 7 на экранной клавиатуре

У меня есть приложение, которое нужно запустить на планшете с Windows 7, и мне нужно, чтобы экранная клавиатура была прикреплена к нижней части экрана. В идеале я хочу, чтобы кто-то не мог перемещать или изменять эти настройки.

Используя комментарий, размещенный в ответе на переполнение стека здесь in-windows-v">Как программно управлять панелью ввода текста (TabTip.exe) в Windows Vista/7 Я могу программно прикрепить клавиатуру к нижней части экрана, так что это начало. Мне пришлось запустить с повышенным разрешением, чтобы заставить его работать

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

[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("user32.dll", SetLastError = true)]
public static extern bool PostMessage(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam);

string onScreenKeyboardPath = @"C:\Program Files\Common Files\Microsoft Shared\ink\TabTip.exe";
var onScreenKeyboardProc = Process.Start(onScreenKeyboardPath);

IntPtr wKB = FindWindow("IPTip_Main_Window", null);

const uint WM_COMMAND = 0x111;
// Where message is 10021 for dock bottom, 10023 for dock top and 10020 for floating
bool x = PostMessage(wKB, WM_COMMAND, new IntPtr(10021), IntPtr.Zero);

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

[DllImport("user32.dll")]
static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);

private const uint SWP_SHOWWINDOW = 0x0040;
bool ok = SetWindowPos(wKB, this.Handle, 0, 500, 750, 500, SWP_SHOWWINDOW);

ok возвращает true, но окна не сдвигаются с места. Если я попытаюсь сделать это с помощью блокнота, он отлично сработает. Так это проблема с этой конкретной программой?


person Firedragon    schedule 09.01.2014    source источник
comment
Связано: stackoverflow.com/questions/1770670/   -  person sshow    schedule 09.01.2014
comment
Просто чтобы быть уверенным: вы говорите о черной клавиатуре нового стиля, размер которой нельзя изменить, или о старой экранной клавиатуре, которая имеет обычную границу окна и может быть изменена?   -  person ASA    schedule 10.01.2014
comment
@Traubenfuchs Я говорил о клавиатуре нового стиля. Но я также просмотрел более старый osk.exe и не смог убедить его переехать. Интересно, было ли это связано с попыткой сделать это на Windows 7 x64. Но, возможно, это требует дополнительного расследования.   -  person Firedragon    schedule 10.01.2014


Ответы (1)


Ваша проблема может быть разделена на следующие части

1) предотвращение перемещения окна
2) предотвращение изменения размера окна
3) предотвращение свертывания окна

1) кажется простым: Как вы предотвращаете окна от перемещается?

2) и 3) можно решить на одном шаге.

У меня есть разные идеи для решения:
а) Создайте тему, которая периодически проверяет, было ли изменено/свернуто/перемещено окно клавиатуры и сброшено его положение с помощью (например) SetWindowPos
Как получить и установить положение окна другого приложения в C#
б) "Слушать" для событий изменения размера/минимизации/перемещения (WH_CBT = происходит ДО любого из этих событий) и завершите его. К сожалению, я не знаю, можно ли и как принудительно отключить события, объявленные через WH_CBT.
Кажется, есть другое решение:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms644990%28v=vs.85%29.aspx
Прокрутите вниз до раздела комментариев, к тому, что написал пользователь Павел Шклейник.
EVENT_SYSTEM_MOVESIZ* и EVENT_SYSTEM_MINIMIZE* кажутся интересными для вашего случая.
Вы можете обнаружить до событий и останавливать их (если бы я только знал, как это сделать) или обнаруживать окончание этих событий и принудительно сбрасывать положение окна (SetWindowPos).
Вики Pinvoke и Google помогут вам настроить перехватчики:
http://www.pinvoke.net/default.aspx/user32.setwineventhook

person ASA    schedule 09.01.2014