在应用程序中,我正在使用屏幕键盘(OSK)在平板电脑上运行它。 我们做了一个叫做OSK的类,它有一个显示和隐藏方法。屏幕键盘关闭按钮事件?
当用户在屏幕键盘上按下'enter'时,osk隐藏。问题是当用户用close(x)按钮关闭OSK时。 OSK隐藏,但发生这种情况时,UI中需要更改一些内容。
有没有一种方法(一个事件或类似的东西)知道用户何时按下OSK上的关闭按钮?
我将展示一些代码I“已经用于显示和隐藏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);
更新: 发现Windows 7的一个可行的解决方案....为Windows 8不工作(我需要)
这是我做过什么来解决Windows 7中的问题: 主想法是,在OSK类中,当显示osk时,我启动Dispatchertimer。现在每隔一秒检查一次osk窗口是否可见。如果是这样,一个事件被解雇,可以在几个地方处理。 (我也检查了定时器_firstshown布尔因为有时需要一段时间的OSK出现
这是我怎么做的: 首先我所做的IsWindowVisible方法的dllimport的
[DllImport("user32.dll", CharSet:=CharSet.Auto)]
class method IsWindowVisible(hWnd:IntPtr):Boolean; external;
在OSK.Show我启动计时器并将_firstShown设置为false(因为它可能需要一段时间才会出现osk) 在此之前,我已将计时器间隔设置为1秒,并向timer.Tick添加了一个eventhandlerf:
_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)中,快乐是短暂的,因为当我测试了它的平板电脑(Windows 8中),它没有工作。计时器等工作正常,它只是看起来像Windows 8不处理iswindowVisible方法。
反正所有的帮助是非常赞赏
因为osk是Windows 7和Windows 8的内置功能,所以您不需要使用所有这些黑客技巧。您应该使用Microsoft Ink API。 –
你怎么解决这个问题?我正在寻找非常类似的功能,但不幸的是,这不起作用。 – YasharBahman
发现这个解决方案有很多问题,在这里工作,但没有在州和更多的问题。我们还没有找到合适的解决方案。这个问题在这里并不是很紧急,因为触摸功能现在是低优先级的。 –