Form.Show() не работает для 1 конкретного компьютера
Я разрабатываю надстройку Excel в C#. Это дополнение содержит панели с некоторыми кнопками для открытия парящих форм.
Мне сообщили, что эта функция больше не работает с одним компьютером в моей компании. Он использует 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; }
}
}
Я даю этот код на всякий случай, но я не совсем уверен, что он неисправен.
Точно такой же код прекрасно работает на любой другой машине, и проблема возникает с любой версией моего дополнения.
Я проверил это с несколькими (стабильными) версиями, и даже с бета-версией проблема все еще возникает.
Тем не менее, он появился после переустановки надстройки на предыдущую версию на компьютере. Это не должно связываться с чем-то внешним, но я считаю, что важно указать на это.
Я использую установщик MSI, созданный с помощью Wix 3.11 для установки.
Я не изменил код, но вот что я попробовал. Я надеюсь, что это не смешно, я неопытен с этим:
- удаление и переустановка надстройки,
- Восстановление Office 2016, а затем удаление / переустановка, когда это ничего не изменит,
- Обновлена версия.NET с 4.6 до 4.7.2 (для надстройки требуется 4.6)
- Обновлены драйверы графической карты на компьютере.
Кроме того, я попытался проверить журналы, чтобы увидеть, возникла ли какая-либо ошибка:
- Мой аддин не показывает ошибки в журналах
- Я настроил проект Visual Studio и запустил надстройку в режиме отладки, с точками останова и всем -> без ошибок любого рода
- Я проверил события журналов Windows и не нашел ничего связанного. Возможно, я что-то пропустил, потому что у меня нет опыта читать их.
Я наконец-то нашел ссылку, которая "что-то сделала":
Как вернуться к более ранней версии офиса 2016
Я вернул версию Office до 16.0.9330.2118, и формы начали работать, как и ожидалось, около 30 минут. Затем мне сообщили, что проблема вернулась, хотя на компьютере ничего не обновлялось. Это просто "снова пошло не так". Я обновил Office до последней версии, и он снова начал работать до следующего утра.
Как видите, ошибка не генерируется, но замена версии Office на другую "делает что-то". Похоже, что это какой-то конфликт с некоторыми библиотеками 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 и не имеет родителя. Использование PointToClient в этом контексте является ошибкой, поскольку его местоположение всегда выражается в экранных координатах, хотя это не является причиной моей проблемы: в этом контексте PointToClient всегда возвращает местоположение, практически совпадающее с координатами экрана.
Я закончил тем, что навсегда удалил вызов PointToClient, решив проблему. Содержимое формы снова следовало за своим контейнером.
Я до сих пор не понимаю, почему PointToClient вызывает такое поведение.
Несколько дней спустя другой коллега получил точно такую же проблему, тогда как на его компьютере ничего не обновлялось. Надстройка перешла от обычного запуска в книге Excel к отображению серых прямоугольников на следующей.
Я не знаю, должен ли я пометить этот вопрос как решенный, так как я смог устранить проблему, но не до конца понимаю, что вызывает его.
1 ответ
Я считаю, что нашел причину проблемы здесь. Проблема "распространилась" еще на 2 компьютера в моей компании, и я смог исправить их с помощью исправления, которое я сделал, хотя я и не знал реальной причины.
Со временем появилась еще одна проблема: элементы управления ToolStrips больше не отображались в формах надстроек.
В конце концов, одному из моих коллег пришлось обновить свою версию для Windows, и это полностью уничтожило все проблемы.
Я проверил, все 3 компьютера работают под управлением Windows 10 версии 1709.
Я нашел ссылку о проблемах с этой версией, но я не совсем уверен, что именно это вызвало неправильное поведение:
https://support.microsoft.com/en-us/help/4340917/windows-10-update-kb4340917
Остальные машины были быстро обновлены до обновления Windows 10 апреля 2018 года, и все снова работает нормально на всех версиях надстройки.