Ниже представлен небольшой код, который находит все запущенные терминалы Quik и запускает экспорт всех таблиц путем нажатия пункта меню 'Экспорт Данных -> Начать экспорт таблиц по DDE'.
Код не требует никаких дополнительных библиотек, вам просто достаточно добавить этот код в свой проект.
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();