我想这样做,因为这概念是很简单的事:对于每一个接受键盘输入(CEdit的,CCombobox可编辑的文本等),当控制的重点是和已启用控制,使屏幕键盘出现。 最好有辅助功能支持(我已经做了关于Microsoft用户界面自动化一些阅读),而不是直接调用osk.exe效用。
当用户将集中在一个可编辑控件的东西非常喜欢触摸屏智能手机。
更新:如果有一个Windows选项,可以使屏幕键盘的行为方式我描述这只是罚款!
更新2:我要的东西是相似http://msdn.microsoft.com/en-us/library/windows/apps/hh465404.aspx ,但在Windows 7。
我曾做过实验与IUIAutomation类,调用直接osk.exe聚焦到可编辑的控制时,和聚焦不可编辑的一个时,请关闭该窗口。
但是,我仍然有三个问题:
1)当打开一个应用的CFileDialog变得无法响应。 同样是发生于仅在应用程序的另一种模态对话框(在所有其他模态对话框一切工作正常)。 我发现的CFileDialog打开一些后台线程,我唯一有问题的模式了。 我怀疑这与线程的问题做。
2)当其他一些控制的重点是,之后我直接点击CBS_DROPDOWN组合框的下拉按钮,不采摘它的编辑控件,我看到OSK的闪光出现和消失。 使用间谍++和UIA检查我的组合框进入到下降状态之前被聚焦文本编辑的怀疑。
3)做了一些实验用SetWindowPos后的MoveWindow
::MoveWindow(osk_wnd->m_hWnd, LeftOsk, TopOsk, -1, -1, FALSE);
要么
osk_wnd->SetWindowPos(NULL, LeftOsk, TopOsk, -1, -1, SWP_NOSIZE | SWP_NOACTIVATE);
并使用也有一些消息处理实验等
//osk_wnd is a CWnd* variable that represents OSK main window
osk_wnd->PostMessage(WM_SYSCOMMAND, SC_MOVE + HTCAPTION, MAKELPARAM(point.x, point.y));
要么
POINT point = {0};
GetCursorPos(&point);
SendMessage(osk_wnd->m_hWnd, WM_NCLBUTTONDOWN, HTCAPTION, MAKELPARAM(point.x, point.y));
SendMessage(osk_wnd->m_hWnd, WM_NCMOUSEMOVE, HTCAPTION, MAKELPARAM(LeftOsk, TopOsk));
GetCursorPos(&point);
SendMessage(osk_wnd->m_hWnd, WM_NCLBUTTONUP, HTCAPTION, MAKELPARAM(LeftOsk + point.x, TopOsk + point.y));
我动弹不得OSK窗口。 我可以移动它是很重要的; 否则,会出现覆盖集中控制,用户无法看到输入他所赐的控制! 附注:对于unminimizing OSK窗口下面的代码工作完美:
if(osk_wnd->IsIconic())
osk_wnd->PostMessage(WM_SYSCOMMAND, SC_RESTORE, NULL);
甚至试图移动该窗口与此AutoIt脚本什么也没做:
If WinActivate("[CLASS:OSKMainClass]") Then
If WinWaitActive("[CLASS:OSKMainClass]") Then
ConsoleWrite("activ" & @CRLF)
Sleep(500)
If WinMove("[CLASS:OSKMainClass]", "", 30 ,320,360,123) Then
ConsoleWrite("move 1" & @CRLF)
EndIf
EndIf
EndIf
If WinMove("[CLASS:OSKMainClass]", "", 30 ,320,360,123) Then
ConsoleWrite("move 2" & @CRLF)
EndIf
我看到的文字
积极地
移动1
招2
被打印出来,但OSK窗口没有被移动到任何地方。 也许它正在积极拒绝posiotioning指令。
我想这AutoIt脚本移动Tabtip.exe窗口,它也失败。 我想这个脚本来移动Visual Studio命令提示符的窗口和它的动作! GRRRRR!
更新3:在我看来,这件事情与用户访问控制和权限做。 如果我禁用用户访问控制或运行应用程序管理器的MoveWindow指令完美的作品! 这同样适用于AutoIt的试图移动OSKMainCLASS窗口! 那么,有没有在Windows 7中的一些本地或组策略让我破例给OSK应用程序?
4)为了得到在64位操作系统上我什么都试过就不需要强制禁用Syswow64资料重定向运行osk.exe,但我无法逃避它。 到目前为止,我没有看到任何问题,但也许下面的代码将导致未来的问题。
const int sysDirNameSize= 1024;
TCHAR sysDir[sysDirNameSize];
if( !GetSystemDirectory( sysDir, sysDirNameSize) )
{
ASSERT(FALSE);
return;
}
CString osk_path = CString(sysDir) + _T("\\osk.exe");
PVOID pOldValue = NULL;
BOOL bRes= Wow64DisableWow64FsRedirection(&pOldValue);
::ShellExecute(NULL, NULL, osk_path, _T("") , sysDir, SW_SHOW);
if(bRes)
Wow64RevertWow64FsRedirection(pOldValue);
更新5:似乎最后的时候,我试图执行osk.exe的过程开始,但它的窗口不会出现! 要属性值osk_wnd,我有穿越的CWnd :: GetDesktopWindow()的所有GW_CHILD Windows搜索的其中一个GetClassName(...)是“OSKMainClass”并没有被发现的功能!