Winapi 更改另一个应用程序的选项卡';带windows api的选项卡式对话框

Winapi 更改另一个应用程序的选项卡';带windows api的选项卡式对话框,winapi,Winapi,我正在编写与外部应用程序中的选项卡式对话框交互的代码。该对话框有两个选项卡,我希望检查第二个选项卡上的控件 当对话框打开时,第二个选项卡及其控件对Spy++不可见;我假设它们仅在选中选项卡时绘制 是否可以通过windows api调用或其他方式以编程方式选择第二个选项卡? 我已尝试向sysTabControl32控件发送TCM_设置游标。这确实会导致第二个选项卡的标题高亮显示,但第二个选项卡窗格本身未绘制,并且Spy++仍然无法看到控件。您可以通过使用SendInput模拟Ctrl+tab键盘输

我正在编写与外部应用程序中的选项卡式对话框交互的代码。该对话框有两个选项卡,我希望检查第二个选项卡上的控件

当对话框打开时,第二个选项卡及其控件对Spy++不可见;我假设它们仅在选中选项卡时绘制

是否可以通过windows api调用或其他方式以编程方式选择第二个选项卡?
我已尝试向sysTabControl32控件发送TCM_设置游标。这确实会导致第二个选项卡的标题高亮显示,但第二个选项卡窗格本身未绘制,并且Spy++

仍然无法看到控件。您可以通过使用
SendInput模拟Ctrl+tab键盘输入来实现这一点:

HWND hWnd = FindWindow(NULL, L"Dialog Title");
SetForegroundWindow(hWnd);

KEYBDINPUT tabDown = {VK_TAB, 0};
KEYBDINPUT tabUp = {VK_TAB, 0, KEYEVENTF_KEYUP};
KEYBDINPUT ctrlDown = {VK_CONTROL, 0};
KEYBDINPUT ctrlUp = {VK_CONTROL, 0, KEYEVENTF_KEYUP};

// ctrl+tab twice
KEYBDINPUT keysequence[] = {ctrlDown, tabDown, tabUp, tabDown, tabUp, ctrlUp};

for (int i=0; i<(sizeof(keysequence)/sizeof(KEYBDINPUT)); i++)
{
  INPUT input;
  input.type = INPUT_KEYBOARD;
  input.ki = keysequence[i];
  SendInput(1, &input, sizeof(INPUT));
}
HWND-HWND=FindWindow(NULL,L“对话框标题”);
setforegroundindow(hWnd);
KEYBDINPUT tabDown={VK_TAB,0};
KEYBDINPUT tabUp={VK_TAB,0,KEYEVENTF_KEYUP};
KEYBDINPUT ctrlDown={VK_控件,0};
KEYBDINPUT ctrlUp={VK_控件,0,KEYEVENTF_KEYUP};
//按ctrl+tab键两次
KEYBDINPUT keysequence[]={ctrlDown,tabDown,tabUp,tabDown,tabUp,ctrlUp};

对于(int i=0;i,如果您阅读文档,它会说明:

使用此消息选择选项卡时,选项卡控件不会发送
TCN\u SELCHANGING
TCN\u SELCHANGE
通知代码

TCM_SETCURSEL
是由拥有选项卡控件的应用程序发送的,因此此类通知是多余的,因为应用程序已经知道它正在更改所选选项卡

但是,由于您正在向外部进程发送
TCM_SETCURSEL
,因此您需要自己发送这些通知,这使应用程序有机会对所选选项卡的更改做出反应,就像用户手动选择目标选项卡一样,例如:

HWND hTabCtrl = ...;
int iTabIndex = ...;

HWND hParent = GetParent(hTabCtrl);

NMHDR nmhdr = {0};
nmhdr.hwndFrom = hTabCtrl;
nmhdr.idFrom = GetDlgCtrlID(hTabCtrl);

nmhdr.code = TCN_SELCHANGING;
if (SendMessage(hParent, WM_NOTIFY, (WPARAM)hTabCtrl, (LPARAM)&nmhdr) == FALSE)
{
    TabCtrl_SetCurSel(hTabCtrl, iTabIndex);

    nmhdr.code = TCN_SELCHANGE;
    SendMessage(hParent, WM_NOTIFY, (WPARAM)hTabCtrl, (LPARAM)&nmhdr);
}

>>我假设它们仅在选中选项卡时才绘制。事实上,它们仅在第一次选中选项卡时创建。