Form.Show() 不适用于 1 台特定计算机

Form.Show() doesn't work for 1 specific computer

我正在用 C# 开发一个 Excel 插件。 此插件包含带有一些按钮的面板,用于打开悬停表单。

我被告知此功能不再适用于我公司的一台计算机。它使用Excel Office 2016 到最新版本。
这是发生了什么:

灰色方框应该是 Windows 表单,但由于某些原因它没有加载。用户单击一个按钮打开它,它只是保持灰色,没有控件,没有事件,没有任何类型的响应。

现在,这是打开表单的代码:

private void _Form_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
{   
    // ActiveForm() returns basically a UserForm with some methods to fit my specific needs
    ActiveForm().ShowMyForm(_columnButton); // --> ClickEvent
}

public void ShowMyForm(object parent = null)
{
    ActiveForm().StartPosition = FormStartPosition.CenterScreen;

    if (parent != null)
        ComputeLocation(parent);

    IntPtr handle = new IntPtr(Excel.Hwnd);
    ActiveForm().Show(new WindowWrapper(handle)); // --> Shows a grey box
}

public class WindowWrapper : IWin32Window
{
    private IntPtr _hwnd;
    public WindowWrapper(IntPtr handle)
    {
        _hwnd = handle;
    }

    public IntPtr Handle
    {
        get { return _hwnd; }
    }
}

我提供此代码以防万一,但我不确定它是否有问题。

完全相同的代码在任何其他机器上都能正常工作,我的插件的任何版本都会出现问题。
我已经用几个(稳定的)版本检查过,即使是测试版,问题仍然存在。

但是,在电脑上重新安装了以前版本的插件后出现了。它不应该与任何外部事物混淆,但我认为指出这一点很重要。
我正在使用 Wix 3.11 生成的 msi 安装程序进行安装。

我没有修改代码,但这是我尝试过的。我希望这不是荒谬的,我对此还没有经验:
- 卸载并重新安装插件,
- 修复 Office 2016,然后 Uninstall/Reinstall 当它不会改变任何东西时,
- 将 .NET 版本从 4.6 更新到 4.7.2(插件需要 4.6)
- 更新了计算机上的显卡驱动程序

此外,我尝试检查日志以查看是否生成了任何类型的错误:
- 我的插件在日志中没有显示错误
- 我已经设置了 Visual Studio 项目并在调试模式下启动了插件,带有断点和所有 --> 没有任何类型的错误
- 我检查了 Windows 日志事件,没有发现任何相关内容。我可能错过了一些东西,因为我没有阅读它们的经验。

我终于找到了 link "did something" :
How to revert to an earlier version of office 2016

我将 Office 版本恢复到 16.0.9330.2118,然后表单按预期开始工作大约 30 分钟。然后我被告知问题又回来了,尽管计算机上没有任何更新。它只是 "went wrong again"。我将 Office 更新到最新版本,它再次开始工作,直到第二天早上。

如您所见,没有生成任何错误,但将 Office 版本换成了另一个 "does something"。似乎与某些 Office 库有某种冲突,但我不知道该怎么做或如何处理。
尽管我注意到一些主题看起来像我的问题,但它们都与代码和表单管理有关。我真的相信这与代码无关,尽管我无法肯定地证明这一点。

有人可以帮我解决这个问题吗?即使是关于如何处理这个问题的一些想法也会受到赞赏,因为我真的对此感到不舒服。

编辑:

所以我有点明白发生了什么,但不完全明白。
我按照@HansPassant 告诉我的和 运行 我同事电脑上的 VS 调试器,一步一步地做了,一次又一次地得到它 运行。 看来问题出在 ComputeLocation 方法上(见原文)。
ComputeLocation 基本上是这样工作的(我稍微简化了一下):

private void ComputeLocation(object parent)
{
    Control parentControl = (Control) parent;
    Point location = parentControl .PointToScreen(new Point(0,0));

    //Process location's coordinates here

    location = parentControl.PointToClient(location);

    ActiveForm().StartPosition = FormStartPosition.Manual;
    ActiveForm().Location = location;
}

我终于注意到使用 PointToClient 时会发生此问题。表单会更改其位置,但其内容不会。
删除对 PointToClient 的调用后,我得到了预期的行为。

我想指出这段代码实际上是错误的(与我在原始部分所说的相反),因为 ActiveForm() 是一个 topMost Form 并且没有父级。在这种情况下使用 PointToClient 是一个错误,因为它的位置总是用屏幕坐标表示,尽管这不是导致我出现问题的原因:在这种情况下,PointToClient 总是 returns 一个与屏幕坐标几乎相同的位置.

我最终永久删除了对 PointToClient 的调用,从而解决了问题。表单的内容再次跟随其容器。

我仍然不知道为什么 PointToClient 会导致此行为。
几天后,另一位同事遇到了完全相同的问题,而他的计算机上没有任何更新。插件从通常在 excel 工作簿上的 运行 到在下一个工作簿上显示灰色框。

我不知道是否应该将这个问题标记为已解决,因为我能够解决这个问题,但不完全理解是什么原因造成的。

我相信我已经找到导致此问题的原因。 "spread" 我公司另外 2 台计算机的问题,我能够通过我所做的更正修复它们,即使我不知道真正的原因。
随着时间的推移又出现了一个问题:ToolStrips 控件不再显示在加载项表单中。

最终,我的一位同事不得不更新他的 Windows 版本,这完全消除了所有问题。
我检查过,所有 3 台计算机都是 运行 Windows 10 版本 1709。
我发现了一个关于此版本问题的 link,但我不完全确定这正是导致错误行为的原因:
https://support.microsoft.com/en-us/help/4340917/windows-10-update-kb4340917

其他机器很快更新到 Windows 2018 年 4 月 10 日的升级,并且每个版本的插件都运行再次正常。