我正在编写代码以与外部应用程序中的选项卡式对话框进行交互。该对话框有两个选项卡,我希望检查第二个选项卡上的控件。
打开对话框时,第二个选项卡及其控件对Spy ++不可见;我假设只有在选中标签时才会绘制它们。
可以通过windows api调用或以其他方式以编程方式选择第二个选项卡吗? 我已经尝试将TCM_SETCURSEL发送到sysTabControl32控件。这确实会导致第二个标签的标题突出显示,但第二个标签窗格本身未被绘制,并且Spy ++仍然看不到控件
答案 0 :(得分:0)
您可以通过使用SendInput
:
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)
如果您阅读文档,则说明:
使用此消息选择标签时,标签控件不会发送
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);
}