Bir uygulamada, bir tablette çalıştığı sırada bir ekran klavyesi (OSK) kullanıyorum. Bir gösteri ve gizleme yöntemine sahip OSK adında bir sınıf oluşturduk.Ekran Klavyesi close button olayı nedir?
Kullanıcı, ekran klavyesinde 'enter' düğmesine bastığında, osk gizler. Sorun, kullanıcı OSK'yi close (x) düğmesiyle kapattığı zamandır. OSK gizleniyor, ancak bazı durumlarda UI'de değişiklik olması gerekiyor.
Kullanıcının OSK'daki kapat düğmesini ne zaman zorladığını bilmek için bir yol var mı (bir olay ya da benzeri bir şey var)?
ben "gösteren ve OSK gizleme kullandı. gösterilen kod Oxygene içindedir (ama bence C# çok benziyor) Elimizdeki ettik
Birinci ettik kod bazı göstereceğiz bazı dllImports: bir sonraki kod OSK gizlemek için kullanılır gizle yönteminde
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;
: Bu kod var
gösteri yöntemde[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;
var oskWindow := FindWindow("IPTip_Main_Window", nil);
var WM_SYSCOMMAND := 274;
var SC_CLOSE := 61536;
PostMessage(oskWindow, WM_SYSCOMMAND, SC_CLOSE, 0);
Güncelleme: Bulunan Windows 7 için bir çalışma çözüm .... (i gerekenler)
Bu şimdiye pencerelerde 7'de sorunu çözmek için ne yaptığını pencereler 8 için çalışmıyor: ana fikir, OSK sınıfında, osk gösterildiğinde bir Dispatchertimer başlattığımdır. Şimdi, eğer osk penceresi görünürse her saniye kontrol edilir. Eğer öyleyse, birkaç yerde ele alınabilecek bir olay kovulur. osk görünmesi için bazen biraz zaman alıyor çünkü (Ben de zamanlayıcı bir _firstshown boole kontrol
İşteNasıl yaptığımı var. ilk ben IsWindowVisible yöntemin bir Dllımport yapılan
[DllImport("user32.dll", CharSet:=CharSet.Auto)]
class method IsWindowVisible(hWnd:IntPtr):Boolean; external;
yılında OSK.Show zamanlayıcıyı başlatın ve _firstShown'u false olarak ayarlayın (osk'un görünmesi biraz zaman alabilir) Bundan önce 1 saniye içinde zamanlayıcı aralığını ayarladım ve zamanlayıcıya bir eventhandlerf ekledim.Tick:
_timer.Interval := new TimeSpan(0,0,1);
_timer.Tick += new EventHandler(_timer_Tick);
Bu _timer_tick içinde kodudur:
bu etmedi i tabletin üzerinde test (windows 8) çünkü (windows 7), sevinç kısa sürmüş benim geliştirme makinede çalışırken zevk olduclass 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;
iş. zamanlayıcı vb iyi çalışıyor, sadece windows 8 iswindowVisible yöntemi ele almıyor gibi görünüyor. Programınız OSK kendisi başlatır yana
Neyse bütün Yardım çok dürüst olmak gerekirse
Tüm bu korsanları kullanmanız gerekmemelidir çünkü osk, hem Windows 7 hem de 8 için yerleşik bir işlevselliktir. Bunun için Microsoft Ink API'sini kullanmalısınız. –
Bunu nasıl anladın? Çok benzer bir işlevsellik arıyorum ama maalesef bu işe yaramadı. – YasharBahman
, bu çözümün çok sayıda sorunu olduğunu, burada çalıştığını, ancak eyaletlerde ve daha birçok problemde işe yaramadığını öğrendi. Henüz uygun bir çözüm bulamadık. Bu sorun çok acil bir durum değil çünkü dokunmatik işlev şu an için düşük öncelikli. –