Вот диаграмма того откуда берутся тормоза в наших роботах.
первоисточник: https://www.cisco.com/application/pdf/en/us/guest/netsol/ns407/c654/ccmigration_09186a008091d542.pdf
using System; using System.Diagnostics; using System.Runtime.InteropServices; using System.Text; namespace QuikIntegration.dde { public class QuikUtil { private static string _exportMenuKey = "Экспорт данных"; private static string _stopExportMenuItem = "Остановить экспорт таблиц по &DDE"; private static string _startExportByDDEMenuItem = "Начать экспорт таблиц по &DDE"; // ReSharper disable InconsistentNaming [DllImport("user32.dll")] static extern IntPtr GetMenu(IntPtr hWnd); [DllImport("user32.dll")] static extern IntPtr GetSubMenu(IntPtr hMenu, int nPos); [DllImport("user32.dll")] static extern int GetMenuItemCount(IntPtr hMenu); [DllImport("user32.dll")] static extern int GetMenuString(IntPtr hMenu, uint uIDItem, StringBuilder lpString, int nMaxCount, uint uFlag); [DllImport("user32.dll")] static extern uint GetMenuItemID(IntPtr hMenu, int nPos); [return: MarshalAs(UnmanagedType.Bool)] [DllImport("user32.dll", SetLastError = true)] static extern bool PostMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam); private const UInt32 MF_BYPOSITION = 0x00000400; public static bool StartDDE() { IntPtr[] quikWindows = FindQuikWindow(); if (quikWindows.Length == 0) { return false; } foreach (var quikWindow in quikWindows) { IntPtr mainMenu = GetMenu(quikWindow); int exportMenuIndex = (int)FindMenuItemByPart(mainMenu, _exportMenuKey); IntPtr exportMenu = GetSubMenu(mainMenu, exportMenuIndex); uint exportIndex = 6; // FindMenuItemByPart(exportMenu, _startExportByDDEMenuItem); uint menuItem = GetMenuItemID(exportMenu, (int)exportIndex); PostMessage(quikWindow, 0x111, (IntPtr)menuItem, (IntPtr)0); } return true; } public static bool StopDDE() { IntPtr[] quikWindows = FindQuikWindow(); if (quikWindows.Length == 0) { return false; } foreach (var quikWindow in quikWindows) { IntPtr mainMenu = GetMenu(quikWindow); int exportMenuIndex = (int)FindMenuItemByPart(mainMenu, _exportMenuKey); IntPtr exportMenu = GetSubMenu(mainMenu, exportMenuIndex); uint exportIndex = 7; // FindMenuItemByPart(exportMenu, _stopExportMenuItem); uint menuItem = GetMenuItemID(exportMenu, (int)exportIndex); PostMessage(quikWindow, 0x111, (IntPtr)menuItem, (IntPtr)0); } return true; } private static IntPtr[] FindQuikWindow() { Process[] processes = Process.GetProcessesByName("info"); IntPtr[] result = new IntPtr[processes.Length]; for (int i = 0; i < processes.Length; i++) { result[i] = processes[i].MainWindowHandle; } return result; } private static uint FindMenuItemByPart(IntPtr menu, string name) { int menuItemsCount = GetMenuItemCount(menu); for (uint menuIndex = 0; menuIndex < menuItemsCount; menuIndex++) { StringBuilder result = new StringBuilder(); GetMenuString(menu, menuIndex, result, 1024, MF_BYPOSITION); string buffer = result.ToString(); if (buffer.Contains(name)) { return menuIndex; } } return 0; } } // ReSharper restore InconsistentNaming }
QuikUtil.StartDDE();остановить
QuikUtil.StopDDE();