【问题标题】:Change tab of another app's tabbed dialog box with windows api使用 windows api 更改另一个应用程序的选项卡式对话框的选项卡
【发布时间】:2014-08-21 15:54:04
【问题描述】:

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

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

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

【问题讨论】:

  • >> 我假设只有在选择选项卡时才会绘制它们。事实上,它们只是在第一次选择选项卡后创建。

标签: winapi


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    如果您阅读文档,它会指出:

    TCM_SETCURSEL message

    当使用此消息选择选项卡时,选项卡控件不会发送 TCN_SELCHANGING 或 TCN_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);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-10
      • 2018-08-29
      • 2021-08-11
      • 2011-11-21
      • 2014-02-05
      • 2012-01-06
      • 2011-05-07
      • 1970-01-01
      相关资源
      最近更新 更多