![]() |
#6 |
Участник
|
Цитата:
Сообщение от 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] } это X++: //pkoz 31.08.2016 HWND HWND() { return application.Hwnd(); } А цикл по System.Diagnostics.Process::GetProcesses() возвращает почти везде нулевой get_MainWindowHandle() что очень странно. Т.е. при использовании перебора всех System.Diagnostics.Process из под аксапты - не получается одновременно получить pid и hwnd и, соответственно, не получается связать их. Последний раз редактировалось Logger; 01.09.2016 в 11:38. |
|
Теги |
com-объект, excel, excel com формат, hwnd, pid |
|
|