Не открывается нужный раздел пользовательской справки по нажатию F1

Автор Тема: Не открывается нужный раздел пользовательской справки по нажатию F1  (Прочитано 43213 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
Нет. Про AutoCAD 2009 и 2010 я им рассказывать не буду, а в последних трёх версиях пока только у тебя возникла проблема
Александр, это я ни в коей мере не Вам - мысли вслух. Я считаю что если производитель не поддерживает более свой продукт (я не имю в виду, что, например, он обязан выпускать заплатки под новые версии операционок, либо обновления других компонентов - тот функционал который декларировался на момент выпуска) - то данную версию продукта надо законодательно признавать бесплатной и свободной к распостранению.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
то данную версию продукта надо законодательно признавать бесплатной и свободной к распостранению.
Ну если кому-то из "власть предержащих" (страну не уточняем, так как мы ведем абстрактный диалог) придёт в голову выполнить твою рекомендацию, то:
1. государство будет признано мировым сообществом как поддерживающее пиратство на государственном уровне.
2. производитель прекратит продавать в эту страну свой программный продукт.

P.S.: Администрация позиционирует этот форум, как форум технической поддержки и помощи программистам. Давайте этой позиции и придерживаться.  Луше проверь как у тебя работает мой код. :)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
Администрация позиционирует этот форум, как форум технической поддержки и помощи программистам. Давайте этой позиции и придерживаться.  Луше проверь как у тебя работает мой код.
Хотелось сказать свои соображения, но правила есть правила. Ваш код проверил - работает(2010).
з.ы. ИХМО при таком количестве нативного кода никак не могу назвать данную конструкцию целесообразной - если только делать отдельную dll с соотвествующими классами.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
ИХМО при таком количестве нативного кода никак не могу назвать данную конструкцию целесообразной - если только делать отдельную dll с соотвествующими классами.
В действительности нативного кода там чуть-чуть, но по поводу отдельный сборки и/или отдельного пространства имён для класса Helper - я полностью согласен.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Предлагаю не отклоняться от основной темы.

Цитата: Александр Ривилис
1. Версия AutoCAD должна быть одной из последних трёх, на которой этот баг воспроизводится.

Тестирую модифицированный вариант кода: добавлена команда ThroughAcedHelp, класс объявлен как static.

Код - C# [Выбрать]
  1. /* Commands.cs
  2.  * © Andrey Bushman, 2014
  3.  * При необходимости закомментируйте или раскомментируйте обозначенные ниже
  4.  * символы компиляции соответственно Вашей версии AutoCAD.
  5.  * В коде определены следующие команды:
  6.  * -  ThroughAttribute
  7.  * -  ThroughAcedSetFunHelp
  8.  * -  ThroughProcess
  9.  * -  ThroughAcedHelp
  10.  */
  11.  
  12. #define AUTOCAD
  13. #define AUTOCAD_NEWER_THAN_2012
  14. #define AUTOCAD_NEWER_THAN_2014
  15.  
  16. using System;
  17. using System.Collections.Generic;
  18. using System.Linq;
  19. using System.Reflection;
  20. using System.Diagnostics;
  21. using System.IO;
  22. using System.Runtime.InteropServices;
  23.  
  24. #if AUTOCAD
  25. using cad = Autodesk.AutoCAD.ApplicationServices.Application;
  26. using Ap = Autodesk.AutoCAD.ApplicationServices;
  27. using Db = Autodesk.AutoCAD.DatabaseServices;
  28. using Ed = Autodesk.AutoCAD.EditorInput;
  29. using Rt = Autodesk.AutoCAD.Runtime;
  30. using Wn = Autodesk.AutoCAD.Windows;
  31. #endif
  32.  
  33. [assembly: Rt.ExtensionApplication(typeof(Bushman.CAD.Samples.Help
  34.   .ExtensionApplication))]
  35. [assembly: Rt.CommandClass(typeof(Bushman.CAD.Samples.Help.Commands))]
  36.  
  37. namespace Bushman.CAD.Samples.Help {
  38.   /// <summary>
  39.   /// Класс, в котором определён набор пользовательских команд AutoCAD
  40.   /// </summary>
  41.   public static class Commands {
  42.  
  43.     #region PInvoke
  44.  
  45. #if AUTOCAD_NEWER_THAN_2012
  46.     const String fnc_location = "accore.dll";
  47. #else
  48.     const String fnc_location = "acad.exe";
  49. #endif
  50.  
  51. #if AUTOCAD_NEWER_THAN_2014
  52.     const String x86_Prefix = "_";
  53. #else
  54.     const String x86_Prefix = "";
  55. #endif
  56.  
  57.     #region acedSetFunHelp
  58.     const String acedSetFunHelp_Name = "acedSetFunHelp";
  59.  
  60.     [DllImport(fnc_location, CharSet = CharSet.Unicode,
  61.       CallingConvention = CallingConvention.Cdecl,
  62.       EntryPoint = "acedSetFunHelp")]
  63.     private static extern Int32 acedSetFunHelp_x64(
  64.         String functionName,
  65.         String helpFile,
  66.         String helpTopic,
  67.         Int32 cmd);
  68.  
  69.     [DllImport(fnc_location, CharSet = CharSet.Unicode,
  70.       CallingConvention = CallingConvention.Cdecl,
  71.       EntryPoint = x86_Prefix + "acedSetFunHelp")]
  72.     private static extern Int32 acedSetFunHelp_x86(
  73.         String functionName,
  74.         String helpFile,
  75.         String helpTopic,
  76.         Int32 cmd);
  77.  
  78.  
  79.     internal static Int32 acedSetFunHelp(
  80.         String functionName,
  81.         String helpFile,
  82.         String helpTopic,
  83.         Int32 cmd) {
  84.       if(IntPtr.Size == 4)
  85.         return acedSetFunHelp_x86(functionName, helpFile, helpTopic, cmd);
  86.       else
  87.         return acedSetFunHelp_x64(functionName, helpFile, helpTopic, cmd);
  88.     }
  89.     #endregion // acedSetFunHelp
  90.  
  91.     #region acedHelp
  92.  
  93.     [DllImport(fnc_location, CharSet = CharSet.Unicode,
  94.   CallingConvention = CallingConvention.Cdecl,
  95.   EntryPoint = "acedHelp")]
  96.     private static extern Int32 acedHelp_x64(
  97.         String helpFile,
  98.         String helpTopic,
  99.         Int32 cmd);
  100.  
  101.     [DllImport(fnc_location, CharSet = CharSet.Unicode,
  102.   CallingConvention = CallingConvention.Cdecl,
  103.   EntryPoint = x86_Prefix + "acedHelp")]
  104.     private static extern Int32 acedHelp_x86(
  105.         String helpFile,
  106.         String helpTopic,
  107.         Int32 cmd);
  108.  
  109.     internal static Int32 acedHelp(
  110.         String helpFile,
  111.         String helpTopic,
  112.         Int32 cmd) {
  113.       if(IntPtr.Size == 4)
  114.         return acedHelp_x86(helpFile, helpTopic, cmd);
  115.       else
  116.         return acedHelp_x64(helpFile, helpTopic, cmd);
  117.     }
  118.  
  119.     #endregion // acedHelp
  120.  
  121.     #endregion // PInvoke
  122.  
  123.     const String commandGroup = "Bushman";
  124.     const String throughAttribute = "ThroughAttribute";
  125.     internal const String throughAcedSetFunHelp = "ThroughAcedSetFunHelp";
  126.     internal const String throughAcedHelp = "ThroughAcedHelp";
  127.     const String throughProcess = "ThroughProcess";
  128.     const String helpPageExtension = ".htm";
  129.     const String chmFileName = "MyHelp.chm";
  130.     internal static readonly String asm_location = Path.GetDirectoryName(
  131.       Assembly.GetExecutingAssembly().Location);
  132.     // Предположим, что файл справки хранится в том же каталоге, что и DLL.
  133.     internal static readonly String chmFileFullName = Path.Combine(
  134.       asm_location, chmFileName);
  135.  
  136.     const String f1_msg = "\nНажмите клавишу F1 для открытия нужного " +
  137.         "раздела справочной системы.\n";
  138.  
  139.     /// <summary>
  140.     /// Пример открытия нужного раздела справки при помощи нажатия клавиши
  141.     /// F1 в момент выполнения команды (регистрация через атрибуты метода).
  142.     /// </summary>
  143.     [Rt.CommandMethod(commandGroup, throughAttribute, null,
  144.       Rt.CommandFlags.Session, null, chmFileName, throughAttribute)]
  145.     public static void ThroughAttribute_Command() {
  146.       Ap.Document doc = cad.DocumentManager.MdiActiveDocument;
  147.       if(null == doc) {
  148.         return;
  149.       }
  150.       doc.Editor.GetPoint(f1_msg);
  151.     }
  152.  
  153.     /// <summary>
  154.     /// Пример открытия нужного раздела справки при помощи нажатия клавиши
  155.     /// F1 в момент выполнения команды (регистрация через функцию
  156.     /// acedSetFunHelp).
  157.     /// </summary>
  158.     [Rt.CommandMethod(commandGroup, throughAcedSetFunHelp,
  159.       Rt.CommandFlags.Session)]
  160.     public static void ThroughAcedSetFunHelp_Command() {
  161.  
  162.       Ap.Document doc = cad.DocumentManager.MdiActiveDocument;
  163.       if(null == doc) {
  164.         return;
  165.       }
  166.       doc.Editor.GetPoint(f1_msg);
  167.     }
  168.  
  169.     /// <summary>
  170.     /// Пример открытия нужного раздела справки при помощи запуска внешнего
  171.     /// процесса с передачей ему необходимого параметра
  172.     /// </summary>
  173.     [Rt.CommandMethod(commandGroup, throughProcess, Rt.CommandFlags.Session)]
  174.     public static void ThroughProcess_Command() {
  175.       Process process = new Process();
  176.  
  177.       String parameter = String.Format("mk:@MSITStore:{0}::/{1}{2}",
  178.         chmFileFullName.Replace(" ", "%20"), throughProcess, helpPageExtension);
  179.       ProcessStartInfo info = new ProcessStartInfo("hh", parameter);
  180.       process.StartInfo = info;
  181.       process.Start();
  182.     }
  183.  
  184.     /// <summary>
  185.     /// Пример открытия нужного раздела справки при помощи нажатия клавиши
  186.     /// F1 в момент выполнения команды (регистрация через функцию
  187.     /// acedHelp).
  188.     /// </summary>
  189.     [Rt.CommandMethod(commandGroup, throughAcedHelp, Rt.CommandFlags.Session)]
  190.     public static void ThroughAcedHelp_Command() {
  191.       // Открываю тот же раздел справки, что и в команде создания процесса
  192.       Int32 result2 = Commands.acedHelp(Commands.chmFileFullName,
  193.         Commands.throughProcess, 0); // 5100
  194.     }
  195.   }
  196.  
  197.   /// <summary>
  198.   /// Класс, реализующий интерфейс IExtensionApplication.
  199.   /// </summary>
  200.   public sealed class ExtensionApplication : Rt.IExtensionApplication {
  201.  
  202.     /// <summary>
  203.     /// Код этого метода будет выполнен сразу после загрузки данной сборки.
  204.     /// </summary>
  205.     public void Initialize() {
  206.       Ap.Document doc = cad.DocumentManager.MdiActiveDocument;
  207.       if(null == doc) {
  208.         cad.DocumentManager.DocumentActivated += DocumentActivated;
  209.         return;
  210.       }
  211.       WriteLoadingReport(doc);
  212.  
  213.     }
  214.  
  215.     void DocumentActivated(object sender, Ap.DocumentCollectionEventArgs e) {
  216.       cad.DocumentManager.DocumentActivated -= DocumentActivated;
  217.       Ap.Document doc = cad.DocumentManager.MdiActiveDocument;
  218.       WriteLoadingReport(doc);
  219.     }
  220.  
  221.     private static void WriteLoadingReport(Ap.Document doc) {
  222.  
  223.       if(null == doc)
  224.         throw new ArgumentNullException("doc");
  225.       if(doc.IsDisposed)
  226.         throw new ArgumentException("doc.IsDisposed == true");
  227.  
  228.       using(doc.LockDocument()) {
  229.         String format = String.Empty;
  230.  
  231.         doc.Editor.WriteMessage("\nСборка \"{0}\" успешно загружена.\n",
  232.           Assembly.GetExecutingAssembly().Location);
  233.  
  234.         if(File.Exists(Commands.chmFileFullName)) {
  235.           Int32 result = Commands.acedSetFunHelp(Commands.throughAcedSetFunHelp,
  236.             Commands.chmFileFullName, Commands.throughAcedSetFunHelp, 0); // 5100
  237.  
  238.           format = "\nФайл \"{0}\" найден. Регистрация раздела справки " +
  239.             "выполнена.\n";
  240.         }
  241.         else
  242.           format = "\nФайл \"{0}\" не найден.\n";
  243.  
  244.         doc.Editor.WriteMessage(format, Commands.chmFileFullName);
  245.       }
  246.     }
  247.  
  248.     public void Terminate() { }
  249.   }
  250. }

Все перечисленные ниже версии AutoCAD установлены на одном компьютере, работающем под управлением Windows 7 x86 Ultimate Rus (виртуальная машинка VirtualBox). На компьютере установлены только AutoCAD 2009-2015, Notepad++, 7Zip, Gallio и Remote debugger для MS Visual Studio 2013.

IDE 2005-2013 установлены на др. виртуальной машинке VirtualBox, работающей под управлением Windows 7 x86 Ultimate. Выполняю удалённую отладку в режиме DEBUG, AnyCPU. В данном случае использую MS Visual Studio 2013 Premium Enu.

Поскольку вас интересует только последние три версии AutoCAD, то показываю результат лишь для них.

AutoCAD 2015 x86 Enu, .NET 4.5:

  ThroughAttribute - пытается открыть справку AutoCAD из Интернет.
  ThroughAcedSetFunHelp - пытается открыть справку AutoCAD из Интернет.
  ThroughProcess - открывает нужный раздел справки в нужном пользовательском CHM файле.
  ThroughAcedHelp - пытается открыть справку AutoCAD из Интернет.

Функции acedSetFunHelp и acedHelp в качестве результата возвращают значение 5100.

========================================

AutoCAD 2014 x86 Enu, .NET 4.0:

  ThroughAttribute - пытается открыть справку AutoCAD из Интернет.
  ThroughAcedSetFunHelp - пытается открыть справку AutoCAD из Интернет.
  ThroughProcess - открывает нужный раздел справки в нужном пользовательском CHM файле.
  ThroughAcedHelp - пытается открыть справку AutoCAD из Интернет.

Функции acedSetFunHelp и acedHelp в качестве результата возвращают значение 5100.

========================================

AutoCAD 2013 x86 Enu, .NET 4.0:

  ThroughAttribute - пытается открыть справку AutoCAD из Интернет.
  ThroughAcedSetFunHelp - пытается открыть справку AutoCAD из Интернет.
  ThroughProcess - открывает нужный раздел справки в нужном пользовательском CHM файле.
  ThroughAcedHelp - пытается открыть справку AutoCAD из Интернет.

Функции acedSetFunHelp и acedHelp в качестве результата возвращают значение 5100.

========================================

Как видим, во всех трёх случаях результат один и тот же.

Цитата: Александр Ривилис
2. Была бы возможность описать ситуацию, в которой этот баг однозначно воспроизводится.
Существует такая компания: Wintellect. Джон Роббинс, один из учредителей этой компании, в своей книге "Отладка приложений для Microsoft .NET" пишет (стр. 46-47):
Цитата: Джон Роббинс, стр. 46-47
Самый важный шаг процесса отладки - первый: воспроизведение ошибки. Иногда это трудно, иногда даже невозможно, но если вы не можете воспроизвести ошибку, то, вероятно, не сможете устранить её. Пытаясь повторить ошибку, иногда приходится прибегать к крайним мерам. Однажды в моём коде встретилась ошибка, которую я не мог воспроизвести, просто запустив программу. Однако мне в голову пришла мысль об определённых состояниях данных, которые могли  вызывать ошибку, поэтому я запустил программу в отладчике и ввёл данные, необходимые для воспроизведения ошибки, прямо в память. Это сработало.
...
Моё определение заключается в повторении ошибки на отдельно взятой машине один раз в течение 24-часового периода. Этого для моей компании достаточно, чтобы приняться за работу над ошибкой. Почему? Всё просто. Если вы сможете получить её на одной машине, то сможете добавить 30 машин и повторить ошибку 30 раз.  При воспроизведении ошибки многие люди делают ещё одну: они не используют в процессе отладки максимально возможное количество машин.
...
Даже если вы не можете воспроизвести ошибку, её всё равно необходимо занести в систему отслеживания ошибок. Если я встречаю ошибку, которую не могу повторить, я обязательно регистрирую её в системе, но оставляю примечание, говорящее, что воспроизвести её не удалось. Таким образом, если за эту часть кода несёт ответственность другой инженер, то он, по крайней мере, будет знать, что что-то не так. Регистрируя ошибку, которую не удалось воспроизвести, нужно как можно лучше описывать её. Если вы дадите достаточно хорошее описание, то это поможет вам или другому инженеру в итоге устранить проблему. Чрезвычайно важно дать всестороннее описание ошибки, так как это позволит заметить взаимосвязи между различными отчётами о неповторяемых ошибках и обнаружить определённые шаблоны в поведении ошибок.

Последнее, о чём я хочу сказать, рассуждая о воспроизведении ошибок - очень редко ошибки удаётся воспроизвести на машине, где вы осуществляете разработку. Причина заключается в том, что на машине для разработки у вас есть различные инструменты и процессы, которых нет на машине для обычного выполнения, или, что ещё хуже, вы можете работать в системе под учётной записью с правами администратора.  Учитывая, что и Microsoft и VMWare предоставляют свои виртуальные среды, нет никаких оправданий отсутствию на вашей машине виртуальной версии среды выполнения с возможностью удалённой отладки. Необходимо воспроизводить ошибки на виртуальной машине, поскольку это даёт лучшие шансы на обнаружение точных шаблонов.
Откровенно говоря, меня неприятно удивляет тот факт, что вас приходится уговаривать о том, чтобы принять меры к устранению обозначенного бага. Такое ощущение, что ваша задача - препятствовать регистрации того, что не удаётся воспроизвести сходу, мол "не вижу ошибку на своём компе, значит её не существует, а пользователь - да и хрен на него, это у него что-то не так с компьютером". В обозначенной мною выше книге написано, что сотрудников, подобным образом относящихся к работе они увольняют, поскольку компания заинтересована в качестве результатов своей работы. Судя по тому, как вы упираетесь - у автодеска иные приоритеты.
« Последнее редактирование: 27-06-2014, 17:48:51 от Андрей Бушман »

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Как видим, во всех трёх случаях результат один и тот же.
Вот с этого нужно было и начинать. Пока я прихожу к выводу, что это глюк в AutoCAD x86 в Windows 7 x86. В таком виде уже можно и отправить в ADN DevHelp.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
В таком виде уже можно и отправить в ADN DevHelp.
ИХМО, в таком не надо, формально баг .NetApi есть только в виде не работающей перегрузке аттрибута CommandMethod, что не работает вызов нативный acedSetFunHelp - это к .NetApi никак не относится (хоть и понятно, что, скорее всего, дело именно в нативной части). Если каким-то чудесным образом окажется, что из-под ARX acedSetFunHelp в указанных версиях будет работать, то по чему не работает "внешний" вызов - это реально не их забота (это не штатный вызов функции - с таким-же успехом можно спросить почему я на дельфи не могу arx писать - не предназначен). Если и из-под ARX сей метод не заработает(что скорее всего) - то это уже и оформлять как баг - и отправлять - там думаю и аттрибут заработает.
з.ы. по части .NetApi - если только писать helloword c соответствующими аттрибутами в CommandMethod...

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Если и из-под ARX сей метод не заработает(что скорее всего) - то это уже и оформлять как баг - и отправлять - там думаю и аттрибут заработает.
Собственно именно это я и собирался сделать.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
з.ы. по части .NetApi - если только писать helloword c соответствующими аттрибутами в CommandMethod...
чем выше обозначенные варианты не "helloword"?

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
Я - если смотрю на кокай-то косяк в первую очередь обрезаю все лишнее - оставляяя только его суть - конечно с этим должны справится и автодесковцы, по в моем понимании это просто не очень культурно (да и заодно лишний раз самому убедится, что вот "голый" вызов апи и именно он не работает).

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
по в моем понимании это просто не очень культурно
У меня понимание иное. В коде показано, что в поисках источника проблемы были испробованы разные варианты решений. Это экономит время на разбирательство.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Сделал тестовый пример на ObjectARX для AutoCAD 2013 и 2014 x86
Загружать при помощи _APPLOAD.
Команды для проверки:
ThroughAcedSetFunHelp - должна по нажатию F1 появится справка  с пунктом ThroughAcedSetFunHelp
ThroughAcedHelp - должна появится сразу справка с пунктом ThroughAcedSetFunHelp
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Итак первый вариант. Прошу тестировать:
Этот .NET код работает (проверял в AutoCAD 2013 x86 Enu). Но! тот, который "Нажмите F1 для ThroughProcess:" открывает как то, что нужно (пользовательский раздел пользовательской справки), так и окно попытки лезть за справкой в инет (при первом вызове TestF1). При последующих вызовах TestF1 всё работает как надо.

P.S. Сейчас гляну вашу версию ARX...

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
мля...

перезапустил акад.
загрузил управляемую сборку (по прежнему смотрю ваш .net код).
запустил Testf1.
нажал и отпустил F1 - для "Нажмите F1 для ThroughAttribute:" запустились оба окна, как в прошлый раз с версией от "Нажмите F1 для ThroughProcess:".

последующие несколько вызовов команды TestF1 работали нормально. Затем та же фигня, но уже для "Нажмите F1 для ThroughAcedSetFunHelp:".

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
я вот думаю... помните ранее обозначенную здесь проблему? Может это как-то связано... Т.е. некоторая накладка при комбинации: Слабый хостовый комп + VirtualBox + скорость обработки нажатий клавиатуры.