如何创建Windows GUI控件ID?

时间:2011-09-14 18:56:48

标签: c# windows user-interface controls ui-automation

在Windows中,对于每个控件(如每个对话框,窗口,文本框和复选框等),将给出控件ID。

如何创建此控件ID? Windows中的两个应用程序可以具有相同的控件ID吗?有没有办法手动设置Windows控件ID?

4 个答案:

答案 0 :(得分:5)

控件ID是传递给CreateWindow函数的参数之一。如果控件是从对话框模板创建的,则对话框管理器从对话框模板中获取控件ID。两个控件具有相同的ID是很常见的。例如,大多数Cancel按钮都具有控件ID IDCANCEL

答案 1 :(得分:4)

除了雷蒙德所写的内容:

创建子窗口(也称为控件)并为它们提供相同的ControlId是完全合法的。唯一的问题是您无法通过其id(使用GetDlgItem())唯一地检索控件。如果您对在运行时操作控件(例如静态标签)不感兴趣,则不必关心为其提供唯一的控件ID。只要给它0xFFFF)。

对于不同应用程序或父窗口中的不同控件/子窗口(例如按钮的IDCANCEL或IDOK),它肯定是合法的(通常)相同的控件ID。 GetDlgItem()检索一个给定父窗口的控件。

答案 2 :(得分:3)

除了其他答案中的信息:

在每个控件的窗口中(对于每个对话框,窗口,文本框和复选框等),将给出一个控件ID

实际上并非如此:顶级窗口 - 例如应用程序窗口和对话框,实际上根本没有控件ID。只有子窗口可以有控件ID。

(顶级窗口使用CreateWindow的该参数来指示窗口的HMENU - 所以只有顶级窗口才能有菜单栏。)

由应用程序开发人员决定如何分配和使用ID。通常它们与GetDlgItem()一起使用,GetDlgItem()查找具有父HWND的给定ID的HWND,因此在这种情况下,ID只需要在该父项中是唯一的。如果开发人员不需要在运行时查找控件,它可以为其提供任何ID,传统上在那里使用-1。

有些框架根本不使用控制ID,只是在创建HWND时跟踪它们。

答案 3 :(得分:0)

除了其他答案:

虽然控件的ID可以相同,但最好让它独一无二。控件使用其id和hwnd将事件报告给其父窗口。在父的消息循环中,我们通常使用id来标识控件,在这种情况下,如果您想要不同的事件处理,请为每个控件使用不同的id。