65.9K
CodeProject 正在变化。 阅读更多。
Home

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

emptyStarIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

0/5 (0投票)

2014年8月15日

CPOL

1分钟阅读

viewsIcon

7475

downloadIcon

55

这是“关闭 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 集成库而言没有更合适的选择。它可能更适合于进程外集成,因为它缓解了原始方案中的重入问题。但是,只有原始文章中的代码经过了适当的测试。

© . All rights reserved.