MFC屏幕键盘上的聚焦编辑器时(MFC on screen keyboard when focusi

2019-07-17 20:43发布

我想这样做,因为这概念是很简单的事:对于每一个接受键盘输入(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”并没有被发现的功能!

Answer 1:

再来一次,我自己解决了这个问题:)

1)中读取后http://social.msdn.microsoft.com/Forums/br/windowsaccessibilityandautomation/thread/aee0be4d-2cf5-45e7-8406-2de3e5d0af03和http://www.c-plusplus.de/forum/285011-全 (德国,但谷歌翻译能帮助),我决定把一个单独的线程相关的代码。 没有更多的CFileDialog打开窗口时挂:)

2)项目经理说,这是一个小问题:)

3)说给项目经理,这将是needded执行osk.exe时,必须通过安全令牌后,他回答说,这将在一个非常简单的事情代码引入大量的复杂性,并且最好是应用程序可以在管理员身份运行模式:)

4)不造成至今的问题,所以让它成为:)

无论如何,感谢帮助。



Answer 2:

对于移动OSK窗口。 初始设定由命令提示低完整性OSK屏幕。 然后你使用的MoveWindow功能。 它生病的工作。



文章来源: MFC on screen keyboard when focusing editable control