none
对于surface TabTip键盘困惑? RRS feed

  • 问题

  • 您好:

    关于surface TabTip键盘我有个困惑。希望您能帮我解答,谢谢您。

    1. 在什么情况下TabTip能自动弹出来?

    2. 本人有个程序,关于调用TabTip小程序的,如下:

    依据窗口句柄去判断是否存在,如果有则显示,否则通过程序去启动TabTip键盘。

    HWND TabTip = FindWindow(L"IPTip_Main_Window",0);
        if (!TabTip)
        {
            ShellExecute(NULL, L"open", L"C:\\Program Files\\Common Files\\microsoft shared\\ink\\TabTip.exe", NULL, NULL, SW_SHOW);
        }
        else
        {
                SendMessage(TabTip,WM_SYSCOMMAND, SW_SHOW, 0);
        }


    那么问题来了,当我启动程序,点击输入框时,由于没发现TabTip窗口句柄存在时,程序会启动调用TabTip窗口,点击TabTip右上角关闭按钮,当我第二次点击输入框时,键盘不再弹出。当我关闭软件时,重新启动程序,重复上次步骤,键盘可以弹出。试问第一次由程序启动键盘后,关闭第二次为啥我显示不出来?


    2019年8月9日 3:49

答案

  • 你好,

    >>如果在在软件启动前,任务管理器中已经有tabtip键盘进程,那么进程不会被杀死

    这个就如community所言,可能是有进程在使用Tabtip,所以你无法杀死进程。目前这一块没有提供直接的API可以帮助你完成显示和隐藏TabTip的操作,杀死进程可能是最简单直接的方法了。

    >>总觉得surface下TabTip键盘采用windows下命令,不太合适,也不知道怎么弄

    这个很抱歉,我们没有surface的环境,因此无法帮助你测试这一块的问题。但我也很困惑,surface官网的详细参数中写明了surface搭载的是Win10系统,surface的系统和普通电脑上Win10有什么区别呢?

    Best Regards,

    Suarez Zhou

    • 已标记为答案 刘男亚 2019年8月12日 8:36
    2019年8月12日 7:11

全部回复

  • 不确定 但是 有时候 有点效果  关于 tabtip我也没那么清楚 。 然后 至于是否通过SW_SHOW它是可以 显示/隐藏,但是某些情况下 我就不得知了 
    2019年8月9日 5:41
  • 你好,

    感谢你在MSDN论坛发帖。

    >>然后 至于是否通过SW_SHOW它是可以 显示/隐藏

    你可以将ShellExecute()中的显示参数换成SW_HIDE或者其他,都不会影响TabTip的显示形式。我认为Tabtip只是单纯被打开了,并没有任何显示参数制约着它。所以第二次你给进程发送WM_SYSCOMMAND的消息也就没有用,他不会去响应这种消息。

    当然你可以测试下,将Tabtip打开,然后关闭,这时它处于后台进程,你尝试给进程发送消息WM_SYSCOMMAND,它也是不会响应的。(这些都是在平板模式下测试的)

    Best Regards,

    Suarez Zhou

    2019年8月9日 7:37
  • 请问一下 ,那总有方法控制它显隐??如果它在处于后台进程,我通过发送WM_SYSCOMMAND 让它显示时候,那是没问题的,但是如果之前没有处于后台进程,我自己ShellExexute()调用,会弹出键盘框,然后关闭,当我通过发送WM_SYSCOMMAND 让它显示时候 ,那就不好使了??这是为啥。
    2019年8月9日 8:08
  • 你好,

    SendMessage(TabTip, WM_SYSCOMMAND, SC_CLOSE, 0);

    考虑下发送这个消息,关闭进程。其实就相当于通过通过关闭打开tabtip来达到显示和隐藏它的效果。只需要在每次你想要它显示的时候去判断下这个进程在不在,在就先发送消息关闭它,在调用ShellExecute()打开它。经测试,应该符合你的要求。

    Best Regards,

    Suarez Zhou

    2019年8月9日 8:31
  • 你好,

    还需要注意一点,你获取的是Tabtip的窗口句柄,无法通过这个句柄杀死Tabtip.exe的进程,需要去找到Tabtip的句柄才能杀死进程。

    Best Regards,

    Suarez Zhou

    2019年8月9日 8:55
  • 你好,

    你可以尝试下底下的代码,这可以杀死进程。保证你在后台进程存在的情况下,让TabTip再次显示出来。

    #include "pch.h"
    #include <iostream>
    #include <windows.h>
    #include <TlHelp32.h>
    #include <tchar.h>
    //根据进程名获取进程ID
    BOOL GetPidByProcessName(TCHAR *pProcess, DWORD *dwPid)
    {
    	HANDLE hSnapshot;
    	PROCESSENTRY32 lppe;
    	//创建系统快照 
    	hSnapshot = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);
    
    	if (hSnapshot == NULL)
    		return FALSE;
    
    	//初始化 lppe 的大小 
    	lppe.dwSize = sizeof(lppe);
    
    	//查找第一个进程 
    	if (!::Process32First(hSnapshot, &lppe))
    		return FALSE;
    	do
    	{
    		if (_tcscmp(lppe.szExeFile, pProcess) == 0)
    		{
    			*dwPid = lppe.th32ProcessID;
    		}
    	} while (::Process32Next(hSnapshot, &lppe)); //查找下一个进程  
    
    	return TRUE;
    }
    BOOL KillProcess(DWORD ProcessId)
    {
    	HANDLE hProcess = OpenProcess(PROCESS_TERMINATE, FALSE, ProcessId);
    	if (hProcess == NULL)
    		return FALSE;
    	if (!TerminateProcess(hProcess, 0))
    		return FALSE;
    	return TRUE;
    }
    int main()
    {
    	HWND TabTip = FindWindow(L"IPTip_Main_Window", 0);
    	if (!TabTip)
    	{
    		ShellExecute(NULL, L"open", L"C:\\Program Files\\Common Files\\microsoft shared\\ink\\TabTip.exe", NULL, NULL, SW_SHOW);
    	}
    	else
    	{
    		TCHAR a[256] = _T("TabTip.exe");
    		DWORD b = 0;
    		GetPidByProcessName(a, &b);
    		KillProcess(b);
    		ShellExecute(NULL, L"open", L"C:\\Program Files\\Common Files\\microsoft shared\\ink\\TabTip.exe", NULL, NULL, SW_SHOW);
    	}
    
    	
    }

    Best Regards,

    Suarez Zhou

    2019年8月9日 9:25
  • 你好,

    请问你的问题解决了吗?如果解决了,请帮忙标记有帮助或者正确的回复为答案,这会帮助其他有相同问题的人更快地找到解决方案。如果没有,欢迎随时提问。谢谢。

    Best Regards,

    Suarez Zhou

    2019年8月12日 2:48
  • 您好:对于您说的方法,有些时候在surface下不太好使,个人觉得surface下TabTip键盘很特殊,感觉有点不同于windows下TabTip。windows下的TabTip键盘我采用您的方法试了,没啥问题但是surface下,就不太相同了。如果在在软件启动前,任务管理器中已经有tabtip键盘进程,那么进程不会被杀死,有些时候通过SendMessage(TabTip, WM_SYSCOMMAND, SC_CLOSE, 0);也不能关闭进程。总觉得surface下TabTip键盘采用windows下命令,不太合适,也不知道怎么弄??
    2019年8月12日 5:48
  • 你好,

    >>如果在在软件启动前,任务管理器中已经有tabtip键盘进程,那么进程不会被杀死

    这个就如community所言,可能是有进程在使用Tabtip,所以你无法杀死进程。目前这一块没有提供直接的API可以帮助你完成显示和隐藏TabTip的操作,杀死进程可能是最简单直接的方法了。

    >>总觉得surface下TabTip键盘采用windows下命令,不太合适,也不知道怎么弄

    这个很抱歉,我们没有surface的环境,因此无法帮助你测试这一块的问题。但我也很困惑,surface官网的详细参数中写明了surface搭载的是Win10系统,surface的系统和普通电脑上Win10有什么区别呢?

    Best Regards,

    Suarez Zhou

    • 已标记为答案 刘男亚 2019年8月12日 8:36
    2019年8月12日 7:11