关闭 Microsoft Dynamics GP 报表目标窗口(备选方案)





0/5 (0投票)
这是“关闭 Microsoft Dynamics GP 报表目标窗口”的替代方案
引言
在本替代方案中,我们使用轮询而不是事件通知来关闭报表目标窗口。
注意
我只会介绍与原始方案不同的部分。要使用此替代方案,请将Closer(文件和类)替换为包含的 Closer2
。
步骤 1:检测报表目标窗口
我们不注册 Windows 事件钩子并等待前台窗口更改的通知,而是运行一个计时器,持续查找我们的报表目标对话框。
void closerTimer_Elapsed(object sender, ElapsedEventArgs e)
{
closerTimer.Enabled = false;
hWndDlg = FindWindow(null, REPORT_DESTINATION_CAPTION);
if ((int)hWndDlg != 0)
{
[...]
}
closerTimer.Enabled = true;
}
我们使用 Win32 API FindWindow()
函数根据其标题识别对话框。报表目标窗口不必是屏幕上最顶层的窗口。
步骤 2:关闭报表目标窗口
在向其发送按键以关闭它时,我们必须确保键盘输入被定向到我们的对话框。因此,在发出按键之前,我们始终检查报表目标窗口是否是屏幕上最顶层的窗口。为此,我们使用 Win32 API GetForegroundWindow()
函数。
if (GetForegroundWindow() == hWndDlg)
{
System.Windows.Forms.SendKeys.SendWait("{TAB}");
System.Windows.Forms.SendKeys.SendWait("{ESC}");
}
结论
我认为此处提供的替代方案与原始方案对于我们的 32 位 Microsoft Dynamics GP Add-in 集成库而言没有更合适的选择。它可能更适合于进程外集成,因为它缓解了原始方案中的重入问题。但是,只有原始文章中的代码经过了适当的测试。