응용 프로그램에서 태블릿에서 실행할 때 화면 키보드 (OSK)를 사용하고 있습니다. 우리는 show and hide 메서드가있는 OSK라는 클래스를 만들었습니다.화면 키보드 닫기 버튼 이벤트?
사용자가 화면상의 키보드에서 '엔터'를 누르면 osk가 숨겨집니다. 문제는 사용자가 close (x) 버튼을 사용하여 OSK를 닫을 때입니다. OSK가 숨겨 지지만 UI가 변경 될 때 일부 사항을 변경해야합니다.
사용자가 OSK에서 닫기 버튼을 눌렀을 때 알 수있는 방법 (이벤트 또는 이와 비슷한 방식)이 있습니까?
내가 "표시와 OSK를 숨기기 위해 사용. 을 표시 코드는 옥시 젼에 (하지만 내가 생각하는 C#을 같은 많은 모양) 우리가했습니다
먼저했습니다 코드의 일부를 보여 드리겠습니다 일부 dllImports : 다음 코드는 OSK를 숨기기 위해 사용되는 숨기기 방법에서
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;
:이 코드가
쇼 방법에[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;
01 23,516,
var oskWindow := FindWindow("IPTip_Main_Window", nil);
var WM_SYSCOMMAND := 274;
var SC_CLOSE := 61536;
PostMessage(oskWindow, WM_SYSCOMMAND, SC_CLOSE, 0);
업데이트 : 찾을 수 윈도우 7에 대한 작업 솔루션 ... (내가 필요한 건)
이 내가 윈도우 7에서 문제를 해결하기 위해 무슨 짓을 윈도우 8에 대한 작동하지 : 주 아이디어는 osk가 표시 될 때 OSK 클래스에서 Dispatchertimer를 시작한다는 것입니다. osk 창이 보이면 1 초마다 검사합니다. 그렇다면 여러 장소에서 처리 할 수있는 이벤트가 발생합니다. OSK를 표시하는 것이 때로는 시간이 걸립니다 때문에 (나는 또한 타이머의 _firstshown 부울을 확인
다음내가 그랬어 방법은 다음과 같습니다. 먼저 내가 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의 코드입니다 :
이 그것을하지 않았다 내가 태블릿에 그것을 테스트 (윈도우 8) 때문에 (윈도우 7), 기쁨이 단명 한 내 개발 시스템에서 일할 때 기쁨이 있었다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;
작업. 타이머 등 괜찮아요, 그냥 창 8 iswindowVisible 메서드를 처리하지 않는 것 같습니다. 프로그램이 OSK 자체를 시작하기 때문에
가 어쨌든 모든 도움은 매우 정직하게
osk는 Windows 7 & 8의 기본 제공 기능이므로 모든 해킹을 사용하지 않아도됩니다. Microsoft Ink API를 사용해야합니다. –
당신은 어떻게 이것을 알아 냈습니까?! 매우 비슷한 기능을 찾고 있지만 불행히도이 기능은 작동하지 않습니다. – YasharBahman
이 솔루션에는 많은 문제가 있지만이 문제는 주에서 발생했지만 더 많은 문제가 있다는 것을 알게되었습니다. 우리는 아직 적절한 해결책을 찾지 못했습니다. 터치 기능이 현재로서는 우선 순위가 낮기 때문에이 문제는 매우 긴급하지 않습니다. –