我想获得子窗口的处理,但不能。 我想在Edit控件中自动插入文本。 这就是我所拥有的:
//global var
int id=0;
BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam) {
id = GetDlgCtrlID(hwnd);
HWND hwnd_Child;
hwnd_Child = GetDlgItem(hwnd, id);
SendMessage(hwnd_Child, WM_SETTEXT, NULL, (LPARAM)"mYtexttttt");
/* other code */
// id is always 0, why ?
// return FALSE; // stop enumerating
return TRUE; // continue enumeration
}
void MyFunction ()
{
HWND hwnd_Parent;
hwnd_Parent = FindWindow(NULL,"MyTitle"); if(! hwnd)return;
EnumChildWindows(hWnd ,(WNDENUMPROC)EnumWindowsProc, NULL);
}
在WinSpy ++中,所有组件的控件ID都是000000000.是否可能没有定义控件ID?
如果我有主窗口的句柄,并且未定义控件ID,如何找到某个特定(编辑框)组件的子句柄?
此外,主窗口是一个使用DirectX运行的游戏应用程序,我认为。 我想在Edit控件中自动插入文本。
答案 0 :(得分:2)
如果WinSpy告诉您控件ID为0,那么从GetDlgCtrlID()返回0当然是预期的结果。你必须做其他事情,比如倒数EnumWindowsProc()调用和/或调用GetClassName(),这样你就可以看到它是一个编辑控件。或GetWindowRect()按位置。
答案 1 :(得分:2)
在您的回调方法中,请执行以下操作:
// get the window text
GetWindowText(hWnd, (LPTSTR)windowText, MAX_PATH);
// get the window info
WINDOWINFO objWinInfo;
GetWindowInfo(hWnd, &objWinInfo)
以上内容可以帮助您获得子窗口。
你也可以FindWindowEx
来获取子窗口。
答案 2 :(得分:1)
控件ID是识别子窗口的一种便捷方式;但不是唯一的方法。所以控制id很可能被设置为任意(或零)值(在这种情况下,父窗口只是通过它们的句柄直接引用它们。
从您的角度来看,如果不存在控制ID,则必须通过制表序列中的位置引用它们,该位置应该是常量并且可以迭代。