使用windows api更改另一个应用程序选项卡式对话框的选项卡

时间:2014-08-21 15:54:04

标签: winapi

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

打开对话框时,第二个选项卡及其控件对Spy ++不可见;我假设只有在选中标签时才会绘制它们。

可以通过windows api调用或以其他方式以编程方式选择第二个选项卡吗? 我已经尝试将TCM_SETCURSEL发送到sysTabControl32控件。这确实会导致第二个标签的标题突出显示,但第二个标签窗格本身未被绘制,并且Spy ++仍然看不到控件

2 个答案:

答案 0 :(得分:0)

您可以通过使用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));
}

答案 1 :(得分:0)

如果您阅读文档,则说明:

TCM_SETCURSEL message

  

使用此消息选择标签时,标签控件不会发送TCN_SELCHANGINGTCN_SELCHANGE通知代码。

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

但是,由于您要将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);
}