在C ++中获取子窗口的句柄

时间:2012-04-02 18:38:41

标签: c++ windows

我想获得子窗口的处理,但不能。 我想在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控件中自动插入文本。

3 个答案:

答案 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,则必须通过制表序列中的位置引用它们,该位置应该是常量并且可以迭代。