В приложении я использую экранную клавиатуру (OSK), когда она работает на планшете. Мы создали класс под названием OSK, который имеет метод show и hide.Экранная кнопка закрытия клавиатуры?
Когда пользователь нажимает «вводить» на экранную клавиатуру, скрывается оск. Проблема заключается в том, что пользователь закрывает OSK кнопкой закрытия (x). OSK скрывается, но некоторые вещи должны меняться в пользовательском интерфейсе, когда это происходит.
Есть ли способ (событие или что-то в этом роде) знать, когда пользователь нажимает кнопку закрытия на OSK?
я покажу некоторые из кода, который я "ве используется для отображения и скрытия OSK. Код, показанный в Oxygene (но это выглядит как C# я думаю)
Сначала мы имеем некоторые dllImports:
[DllImport("user32.dll", SetLastError := true)]
class method PostMessage(hWnd: IntPtr; Msg: UInt32; wParam, lParam: IntPtr): Boolean; external;
[DllImport("user32.dll", SetLastError := true)]
class method FindWindow(lpClassName, lpWindowName: String): IntPtr; external;
в методе шоу есть этот код:
using p := new Process do
begin
p.StartInfo.UseShellExecute := true;
p.StartInfo.FileName := 'C:\Program Files\Common Files\Microsoft Shared\ink\TabTip.exe';
p.Start();
end;
в скрыть метод следующий код используется, чтобы скрыть OSK:
var oskWindow := FindWindow("IPTip_Main_Window", nil);
var WM_SYSCOMMAND := 274;
var SC_CLOSE := 61536;
PostMessage(oskWindow, WM_SYSCOMMAND, SC_CLOSE, 0);
Обновление: Найдено рабочее решение для окон 7 .... не работает для Windows 8 (Что мне нужно)
Это то, что я сделал, чтобы решить эту проблему в Windows 7: Главный Идея заключается в том, что в классе OSK я запускаю Dispatchertimer, когда отображается osk. Теперь каждую секунду проверяется, видно ли осковое окно. Если это так, происходит событие, которое может быть обработано в нескольких местах. (Я также проверить _firstshown логическое значение в таймере, потому что иногда требуется некоторое время для OSK появляться
Вот как я сделал это:. первый я сделал DllImport из IsWindowVisible метода
[DllImport("user32.dll", CharSet:=CharSet.Auto)]
class method IsWindowVisible(hWnd:IntPtr):Boolean; external;
В OSK.Show я запускаю таймер и устанавливаю _firstShown в false (потому что для отображения osk может потребоваться некоторое время) До этого я установил интервал таймера на 1 секунду и добавил eventhandlerf в timer.Tick:
_timer.Interval := new TimeSpan(0,0,1);
_timer.Tick += new EventHandler(_timer_Tick);
Это код в _timer_tick:
class method OSK._timer_Tick(sender: Object; e: EventArgs);
begin
var oskWindow := FindWindow("IPTip_Main_Window", nil);
var IsOSKOpen := IsWindowVisible(oskWindow);
if not _firstShown then begin
if IsOSKOpen then _firstShown := true;
exit;
end;
if not IsOSKOpen then begin
OSKClosed(nil,new EventArgs());
_timer.Stop();
_firstShown := false;
end;
end;
Был приятно, когда это работало на моей машине развития (Windows 7), радость была недолговечной, потому что, когда я тестировал его на планшете (окна 8), он не сделал Работа. таймер и т. д. отлично работает, он просто выглядит так: Windows 8 не обрабатывает метод iswindowVisible.
Во всяком случае вся помощь очень высоко ценится
Вам не нужно использовать все эти хаки, поскольку osk - это встроенная функциональность для окон 7 и 8. Для этого вы должны использовать API Microsoft Ink. –
Как вы это поняли ?! Я ищу очень похожие функции, но, к сожалению, это не сработало. – YasharBahman
выяснил, что это решение имеет много проблем, работало здесь, но не в штатах и еще много проблем. Мы еще не нашли правильного решения. Этот вопрос не является очень срочным, потому что сенсорные функции на данный момент являются низкими приоритетами. –