Имя: Пароль:
1C
 
Внешняя компонента на C#. Как получить хэндл окна 1С ?
0 MTM777
 
23.04.08
21:24
Без использования FindWindow..
Хочу посылать окну сообщения всякие, разные..)

???
1 MTM777
 
23.04.08
21:34
не густо...
2 MTM777
 
23.04.08
23:03
Все таки пришлось сделать через GetForegroundWindow..
3 romix
 
модератор
23.04.08
23:31
Ну можно по заголовку искать окно, по классу, а можно дерево подчиненных окон проанализировать относительно известного окна (там несколько ф-й WinAPI не очень сложных).

В составе VC++ есть утилитка SPYXX.exe которая позволяет демонстрировать имя класса, текст окна, какие там идут сообщения. Чтобы ей воспользоваться надо нажать на пимпочку Поиск, там есть фишка типа прицела (кружок с крестиком), его перетащить мышью на нужное окно, и программа отобразит сведения по окну.
4 Hadgehogs
 
24.04.08
00:36
Как учил Конфуций - есть 3 пути: подражание - самый легкий, ошибок - самый болезненный, размышления - самый благородный.
5 Hadgehogs
 
24.04.08
00:37
Легкий - GetForegroundWindow()
6 Hadgehogs
 
24.04.08
00:38
Болезненный (путь самурая)

function EnumProc(WND:Cardinal;Param:WORD):Boolean;STDCALL;
var
PID:Cardinal;
Buffer:Array[0..255] of char;
Begin
Result:=true;
PID:=0;
GetWindowThreadProcessId(WND,@PID);
if PID=GetCurrentProcessId then begin
ZeroMemory(@Buffer,255);
GetClassName(WND,@Buffer,255);
if UpperCase(String(Buffer))='V8TOPLEVELFRAME' then begin
Result:=false;
MainHandle:=WND;
end;
end;
End;


function _GetMainHandle():Cardinal;
begin
//ShowMessage('Попытка получения кривого дескриптора');
MainHandle:=0;
EnumWindows(@EnumProc,0);
Result:=MainHandle;
end;
7 Hadgehogs
 
24.04.08
00:42
Благородный:

 { IExtWndsSupport Interface }
 IExtWndsSupport = interface(IUnknown)
   ['{EFE19EA0-09E4-11D2-A601-008048DA00DE}']
   function GetAppMainFrame(var hwnd: HWND): HResult; stdcall;
   function GetAppMDIFrame(var hwnd: HWND): HResult; stdcall;
   function CreateAddInWindow(const bstrProgID: WideString; const bstrWindowName: WideString;
                            dwStyles: Integer; dwExStyles: Integer; var rctl: RECT;
                            Flags: Integer; var pHwnd: HWND; var pDisp: IDispatch): HResult; stdcall;
 end;
var
iExtWindows: IExtWndsSupport;

function AddInWindows.CallAsFunc(lMethodNum: Integer; var pvarRetValue: OleVariant; var paParams: PSafeArray): HResult; stdcall;
begin
if MAINHANDLE=0 then begin
 iExtWindows.GetAppMainFrame(HWND(MAINHANDLE));
 iExtWindows.GetAppMDIFrame(HWND(MAINMDIHANDLE));
end;
end;
8 Hadgehogs
 
24.04.08
00:44
Только в C# как не скажу. И не забывайте, что ОКНО доступно только в
ПриНачалеРаботыСистемы()
но не раньше.
Удачи, сегун.
9 MTM777
 
24.04.08
11:43
Спасибо Romix, Hadgehogs за советы!

(3) Про SpyXXX я знаю, юзал както.. Только я пока не въеду как на форме (главной, которую я уже отловил) находить нужные мне элементы (поле ввода и все такое). Щас стоит задача отлавливать попадание фокуса на элемент формы, узнать его )), а потом переключить расскладку клавы на нужную. Был бы рад если чего нить подсказал.

(7) Ну дык я с самого начала попыткался в благородство играть..))
тока не получилось перевести дельфийский код в шарповский.
Вот и пришлось сделать через подражание..))

Спасибо еще раз!
10 MTM777
 
24.04.08
17:36
to Romix...
11 Hadgehogs
 
24.04.08
17:39
Делай болезненный. Он наверняка сработает.
12 MTM777
 
24.04.08
17:41
(11) )))
осталось только его на шарп перевеси..
13 Hadgehogs
 
24.04.08
17:42
В шарпе адрес функции узнать можно?
14 MTM777
 
24.04.08
17:42
да наверное, я на него недавно подсел..
15 MTM777
 
24.04.08
17:45
(13) к вопросу, который я Romix-у задал -
щас смотрю через Spy++, у всех элементов формы класс назыввается "V8FormElement",
а вот теперь как их ФИО узнать ? вот в чем вопрос...
а потом еще нужно отловить попадание на него фокуса..
16 MTM777
 
24.04.08
17:47
(15)+
надо наверное какой нить глобальный хук на главную форму наложить, там и отслеживать фокус.., но как..?
17 Hadgehogs
 
24.04.08
17:49
(17) ВОТ и ты узнал сакральный смысл восьмерки :-)
18 Hadgehogs
 
24.04.08
17:51
Если формы еще по Заголовку можно поймать, то их элементы курят в сторонке.
19 MTM777
 
24.04.08
17:52
(18) ага...)
ну шожь, бум иба...я дальше..
20 Hadgehogs
 
24.04.08
17:59
(шепотом)
И даже ЦветФона ОНИ вне Brush-а окна хранят...
21 MTM777
 
24.04.08
18:01
(20) тихонько посмеюсь... )))))))))))))))))))))))))))))))))))))))))))
22 TormozIT
 
гуру
24.04.08
18:53
Друзья, буду очень благодарен, если кто то напишет мне компоненту для получения координат курсора в поле текстового документа отностельно левого верхнего угла главного окна приложения(!) Это нужно мне для более удобного позиционирования окно контекстной подсказки.
Сразу скажу, что задача довольно непростая, но может кто то сумеет таки.
23 AmoreMe
 
24.04.08
19:18
На С++ (MFC) или WinAPI это решается очень просто... Думаю на С# не сложней скорее ещё проще!Получаем описатель окна, получаем координаты клиентской области,определяем попадает ли щелчок правой кнопки мышки (отпускание) в область... Если да выводим контекстное меню (или передаем управление 1С). Кстати контролы на форме такие же окна (дочерние) с ними все что угодно творить можно имея описатель окна.
24 MTM777
 
24.04.08
19:22
(22) как только, так сразу! но пока не скоро..))
(23) в теории вроде бы все понятно, осталось тока сделать..))
25 AmoreMe
 
24.04.08
19:30
Можно DLL написать и загружать её в адресное пространство процесса 1С ("Известные DLL"), функции экспортируемые из этой DLL могут выполнять всю работу т.к. разделят одно адресное пространство с процессом 1С
26 romix
 
модератор
24.04.08
19:38
(0)
>если не затруднит, пример на любом языке.
http://x-romix.narod.ru/
* vk_windows.rar (90K) - Внешняя компонента для работы с окнами Windows.

Там есть методы:

   (
   ('FindWindow','НайтиОкно','1'),
   ('SelectWindows','ВыбратьОкна','1'),
   ('GetNextWindow','ПолучитьСледующееОкно','0'),
   ('GetOwnerWindow','ПолучитьВышестоящееОкно','0'),
   ('PressButton','НажатьКнопку','1'),
   ('GetText','ПолучитьТекст','2'),
   ('SetText','УстановитьТекст','2'),
   ('GetDeskTopWindow','ПолучитьОкноРабочегоСтола','0'),
   ('GetWindowByHWND','ПолучитьОкноПоНомеру','1')
   );

цифра - число параметров метода.
27 MTM777
 
24.04.08
19:41
(26) спасибо конечно большое !!!
но файла там нету...
28 MTM777
 
24.04.08
19:42
(27)+ не качается, пишет "Отсутсвует ресурс"
29 MTM777
 
24.04.08
19:48
(26) может на мыло скинешь  mtm999@inbox.ru ?
30 romix
 
модератор
24.04.08
19:49
(28) Ой сорри исправил.
31 romix
 
модератор
24.04.08
19:49
Там название файла было не в том регистре.
32 MTM777
 
24.04.08
19:51
(31) все, скачал. Спасибо!!!
33 TormozIT
 
гуру
24.04.08
20:50
(23) Имеется ввиду курсор в тексте, а не мышки
34 MTM777
 
24.04.08
20:57
(33) надо Romix`а очень хорошо попросить, он на такие дела мастер (ИМХО).
35 TormozIT
 
гуру
24.04.08
21:06
(34) К сожалению, сдается мне, что задачка трудно решаема без глубокого изучения внутренней жизни 1с8 окон
36 Hadgehogs
 
24.04.08
21:32
(35) Счаст гляну
37 Hadgehogs
 
24.04.08
21:36
Немного не понятно уточнение "отностельно левого верхнего угла главного окна приложения(!) " Как будто действительно для курсора мыша, а не клавиатуры...
38 Hadgehogs
 
24.04.08
21:43
Не, чегото лом. Я лучше парню из соседней ветки калькулятор в 1С помогу написать :-)
39 TormozIT
 
гуру
24.04.08
21:48
(38) Ну есть у меня поле текстового документа. В нем есть скроллбары. Я куда то их подвигал и вижу курсор в тексте. Теперь юзер жмет CTRL+SPACE. Мне нужно открыть форму с подсказкой чуть ниже места на экране, где собственно находится текстовый курсор.
40 MTM777
 
24.04.08
21:50
(38) ))) жжёшь!
41 MTM777
 
24.04.08
21:59
(38) почитал Как написать калькулятор в 1с? Хелп ПЛИЗ!, еле-еле в себя пришел..)))))
42 Hadgehogs
 
24.04.08
22:34
(39) Делов то, щас сделаю.
43 Hadgehogs
 
24.04.08
23:02
(39)
http://infostart.ru/profile/21242/projects/1737/
в конфе обработка "Работа с клавиатурой"
аська и почта в личке.
44 TormozIT
 
гуру
24.04.08
23:21
(43) Спасибо. Но в обработке "Работа с клавиатурой" все работает с элементом управления "ПолеВвода", а мне "ПолеТекстовогоДокумента" нужно.
45 MTM777
 
25.04.08
12:16
(43) Красавчег!
46 Hadgehogs
 
25.04.08
12:18
(45) Ты про мою фотку из обработки "Работа с буфером обмена" :-)
47 MTM777
 
25.04.08
14:05
(46) да нет, ты не в моем вкусе..))) мне больше девки нравятся)))
я про ВК.
48 MTM777
 
25.04.08
14:06
(46) может исходниками поделишься ? ;)
Компьютеры — это как велосипед. Только для нашего сознания. Стив Джобс