AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 01.09.2016, 11:35   #6  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,987 / 3273 (117) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Будет ли ваш HWND равен Process.MainWindowHandle ? Или если excel скажем скрыт (visible = false), то окна у процесса вообще не будет? Хотя если есть HWND, то должно быть и окно. Будет ли оно основным для процесса?

Если будет, то тогда можно перебрать все процессы и найти нужный. Или тот же самый отбор сделать через скрипт PowerShell (System.Management.Automation)
http://stackoverflow.com/questions/4...rom-com-object
Спасибо за идею.
Набросал джобик
X++:
static void _2(Args _args)
{
    SysExcelApplication     SysExcelApplication;
    hwnd            hwnd;
    System.Diagnostics.Process[]    pr;
    System.Diagnostics.Process      proc;
    int             pCount;
    int             i;
    str             toString;
    str             procName;
    int             id;
    System.IntPtr   mainWindowHandle;
    int             iMainWindowHandle;
    int64           i64MainWindowHandle;
    System.IntPtr   handle;
    int             iHandle;
    container getWindowThreadProcessId(HWND _hwnd)
    {
        #define.sizeOfInt(4)
        container   ret = [0, 0];
        DLL         _DLL             = new DLL('USER32');
        DLLFunction dllFunction      = new DLLFunction(_DLL, 'GetWindowThreadProcessId');
        Binary      lpdwProcessId    = new Binary(#SizeOfInt);
        int         pid;
        ;
        dllFunction.returns(ExtTypes::DWord); // DWORD WINAPI
        dllFunction.arg(ExtTypes::DWord);     // _In_      HWND    hWnd,
        dllFunction.arg(ExtTypes::Pointer);   // _Out_opt_ LPDWORD lpdwProcessId

        pid = dllFunction.call(_hwnd, lpdwProcessId);
        if (pid)
        {
            ret = [pid, lpdwProcessId.dWord(0)];
        }
        return ret;
    }
    ;

    //SysExcelApplication = SysExcelApplication_NET::construct();
    SysExcelApplication = SysExcelApplication::construct();


    hwnd = SysExcelApplication.HWND();

    info(strFMT("%1", hwnd));
    info(con2str(GetWindowThreadProcessId(hwnd)));

    pr = System.Diagnostics.Process::GetProcesses();
    pCount = pr.get_Length();
    for (i = 1; i < pCount; i++)
    {
        proc = pr.GetValue(i);

        toString = proc.ToString();
        procName = proc.get_ProcessName();
        id       = proc.get_Id();
        mainWindowHandle = proc.get_MainWindowHandle();
        iMainWindowHandle = mainWindowHandle.ToInt32();
        i64MainWindowHandle = mainWindowHandle.ToInt64();
        handle  = proc.get_Handle();
        iHandle = handle.ToInt32();

        info(con2str([
            id,
            imainWindowHandle,
            i64MainWindowHandle,
            ihandle,
            procName,
            toString
        ]));
    }

// [url]http://www.cyberforum.ru/csharp-beginners/thread4966.html[/url]
}
где SysExcelApplication.HWND();
это
X++:
//pkoz 31.08.2016
HWND HWND()
{
    return application.Hwnd();
}
В общем, вызов GetWindowThreadProcessId работает корректно даже при невидимом Excel. Возвращает контейнер где вторым параметром стоит pid

А цикл по System.Diagnostics.Process::GetProcesses() возвращает почти везде нулевой get_MainWindowHandle() что очень странно. Т.е. при использовании перебора всех System.Diagnostics.Process из под аксапты - не получается одновременно получить pid и hwnd и, соответственно, не получается связать их.

Последний раз редактировалось Logger; 01.09.2016 в 11:38.
Теги
com-объект, excel, excel com формат, hwnd, pid

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
AX2009 -> RU5 -> RU6 -> RU7 Pustik DAX: Прочие вопросы 8 21.05.2011 15:25
Dynamics AX Sustained Engineering: Sale Order Batch Invoicing reprints invoices from prior runs, when “Print” is set to ‘After’ on AR >> Periodic >> Sales Update >> Invoice form Blog bot DAX Blogs 0 24.03.2010 02:06
Журнал переноса->Строки->Поле "Количество" . Нужен "0" по умолчанию вместо ATimTim DAX: Функционал 5 26.06.2004 12:17
query->DataSource->grid ald DAX: Программирование 2 06.02.2004 09:24
Заказов -> Строки заказов -> Запросы -> Пункт "Производство" Андре DAX: Программирование 1 20.09.2002 10:43

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 18:39.