如何确定Tcl_Obj是否是某种ttk::entity,例如ttk:entry? 我正在使用一个遗留的(桌面样式,如他们现在所知道的)Windows应用程序,主要是用C和C++构建的。当该应用程序在触摸屏Windows笔记本电脑上运行时,当用户在对话框屏幕上点击输入框时,我需要自动显示触摸键盘。这种行为非常常见,据我所知,Microsoft在Windows 8/8.1中禁用了以前的自动行为,并将在Windows 10中重新启用它

如何确定Tcl_Obj是否是某种ttk::entity,例如ttk:entry? 我正在使用一个遗留的(桌面样式,如他们现在所知道的)Windows应用程序,主要是用C和C++构建的。当该应用程序在触摸屏Windows笔记本电脑上运行时,当用户在对话框屏幕上点击输入框时,我需要自动显示触摸键盘。这种行为非常常见,据我所知,Microsoft在Windows 8/8.1中禁用了以前的自动行为,并将在Windows 10中重新启用它,c++,tcl,tk,C++,Tcl,Tk,所以。。。我可以编程显示触摸键盘,这部分已经解决了。我现在要做的是捕捉ttk::entry小部件接收到焦点,然后激活键盘。最接近我的是tk8.5.9/generic/tkFocus.c。有一种称为Tk_FocusObjCmd的方法: /* *-------------------------------------------------------------- * * Tk_FocusObjCmd -- * * This function is invoked to proce

所以。。。我可以编程显示触摸键盘,这部分已经解决了。我现在要做的是捕捉ttk::entry小部件接收到焦点,然后激活键盘。最接近我的是tk8.5.9/generic/tkFocus.c。有一种称为Tk_FocusObjCmd的方法:

 /*
 *--------------------------------------------------------------
 *
 * Tk_FocusObjCmd --
 *
 *  This function is invoked to process the "focus" Tcl command. See the
 *  user documentation for details on what it does.
 *
 * Results:
 *  A standard Tcl result.
 *
 * Side effects:
 *  See the user documentation.
 *
 *--------------------------------------------------------------
 */

int
Tk_FocusObjCmd(
    ClientData clientData,  /* Main window associated with interpreter. */
    Tcl_Interp *interp,     /* Current interpreter. */
    int objc,           /* Number of arguments. */
    Tcl_Obj *CONST objv[])  /* Argument objects. */
{
除其他外,该方法还提供了一个Tcl_Obj对象数组。我要做的是找出被操作的对象是否属于某种类型,比如ttk::entry。如果是,我将启动触摸键盘。我尝试过使用object->typePtr->name,但这并不能满足我的期望,有时它会崩溃(还不知道为什么):


这就是我被困的地方。我将非常感谢任何能让我走上正确方向的见解。

你做得完全错误。相反,您应该做的是假设您被传递了一个小部件名称(类似于
.a2.b5.c9
),然后让Tk告诉您具有该名称的小部件的类是什么

winfo class .a2.b5.c9
对于
ttk::entry
的实例,这将返回
TEntry
(除非您通过在小部件创建时传入
-class
选项对其进行更改)

从C级开始,您可以使用
Tk_class()
查询该类,该类使用单个
Tk_窗口
参数(您可以通过
Tk_NameToWindow
获取该参数,并传递参数值的字符串形式,然后您可以从
Tcl_GetString
获取该参数)。但如果只使用
Tcl\u VarEval
,假设窗口名不是邪恶的,可能会更简单

if(Tcl_VarEval(interp,“winfo类”,Tcl_GetString(objPtr),NULL)=Tcl_OK){
const char*className=Tcl_GetString(Tcl_GetObjResult(interp));
// ...
}

(真正谨慎或热衷于速度的人将使用
Tcl\u EvalObjv
,但这有点复杂。)

非常感谢!我使用了你的示例技术,效果很好。当我在ttk::entry字段中单击时,它将类名显示为TEntry。
winfo class .a2.b5.c9