Delphi+AutoCAD. Переключение между приложениями.
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Delphi+AutoCAD. Переключение между приложениями.

Delphi+AutoCAD. Переключение между приложениями.

Ответ
Поиск в этой теме
Непрочитано 29.06.2005, 08:54 #1
Delphi+AutoCAD. Переключение между приложениями.
Igel
 
Программирую под AutoCAD и не только.
 
г. Пермь
Регистрация: 29.06.2005
Сообщений: 4

Есть 2 приложения. Одно на Дельфи (прога), другое АвтоКАД 2002. Настроен режим работы либо в АвтоКАд, либо в проге. Т.е. когда жму кнопку перейти (своя кнопка), должен фокус передаться проге. Когда в проге жму перейти фокус должен передаться АвтоКАДу и конкретному окну чертежа.
Под фокусом понимаю следующее - приложение должно стать вперед и быть активным. Использовал функции API SetForegroundWindow. Срабатывает один раз и все, потом просто мигает в панели задач.
Что посоветуете?
Просмотров: 6026
 
Непрочитано 29.06.2005, 09:54
#2
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372


SetForegroundWindow вообще-то работает надежно (если правильно передан номер окна). Но окно приложения еще может быть и свернуто, поэтому фокус может быть на нем, а окна на десктопе не быть. Надо заботиться и о восстановлении размеров.

Если же используются компоненты для сохранения-восстановления размера и положения окна, то могут влиять и они. Запомнят, что окно было свернуто, а потом, при установке фокуса, восстанавливают свернутость.

А если непонятно что - запуск с трассировкой.
ShaggyDoc вне форума  
 
Автор темы   Непрочитано 29.06.2005, 13:27
#3
Igel

Программирую под AutoCAD и не только.
 
Регистрация: 29.06.2005
г. Пермь
Сообщений: 4


Цитата:
Сообщение от ShaggyDoc
SetForegroundWindow вообще-то работает надежно (если правильно передан номер окна). Но окно приложения еще может быть и свернуто, поэтому фокус может быть на нем, а окна на десктопе не быть. Надо заботиться и о восстановлении размеров.
Это было пытался, тут еще такая ситуация, когда передаю управление, то видно следующее:
Приложение, которое передает на панели задач "вдалено", а получившее моргает синим.
Тут подумал, а я ведь не напрямую передаю управление, а использую связующий СОМ-сервер, может он мешает приложениям отдать фокус?
Igel вне форума  
 
Непрочитано 29.06.2005, 13:58
#4
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372


У меня есть несколько автономных программ (см. http://www.kurganobl.ru/cad/docs.jsp?tn=documents ), в которых используется вырезка иллюстраций к XML- меню из окон других приложений. Приложений может быть много открыто, поэтому используется ListView для выбора требуемого:
Код:
[Выделить все]
procedure TfrmSingleListView.FormCreate(Sender: TObject);
var
  buff: array[0..127] of Char;
  Wnd: hWnd;
var i: integer;
  itm: TListItem;

begin
  Wnd := GetWindow(Handle, gw_HWndFirst);
  while Wnd <> 0 do
  begin {Не показываем:}
    if (Wnd <> Application.Handle) and {-Собственное окно}
      IsWindowVisible(Wnd) and {-Невидимые окна}
      (GetWindow(Wnd, gw_Owner) = 0) and {-Дочернии окна}
      (GetWindowText(Wnd, buff, sizeof(buff)) <> 0) {-Окна без заголовков}
      then
    begin
      GetWindowText(Wnd, buff, sizeof(buff));
      itm := ListView.Items.Add;
      itm.caption := StrPas(buff);
      itm.SubItems.Add(IntToStr(wnd))
    end;
    Wnd := GetWindow(Wnd, gw_hWndNext);
  end;
end;


procedure TfrmSingleListView.btnOkClick(Sender: TObject);
var
  item: TListItem;
  Wnd: hWnd;

begin
  item := ListView.Selected;
  if item <> nil then begin
    Wnd := StrToInt(item.SubItems[0]);
    SetForegroundWindow(Wnd);
  end;
  Close;

end;
После выбора приложения и щелчке по OK окно выбранного приложения фокусируется (SetForegroundWindow(Wnd)) и из него происходит вырезка фрагмента экрана. Если выбранное окно свернуто в панель задач, то вырезать его нельзя - оно в фокусе, но не развернуто.

Эта же форма вызывается из COM-сервера, запускаемого из-под Автокада. Эффект то же. Только окно самого Автокада свернуть в этот момент нельзя - оно заблокировано модальным диалогом. Хотя переключиться в него через щелчок на панели можно (через Alt-Tab нельзя), и оно не будет перекрыто диалогом.

Делаю вывод, что свое приложение надо не только фокусировать, но и восстанавливать. То же самое надо делать и с Автокадом, если удастся запустить немодальный COM из Автокада.
ShaggyDoc вне форума  
 
Автор темы   Непрочитано 30.06.2005, 13:29
#5
Igel

Программирую под AutoCAD и не только.
 
Регистрация: 29.06.2005
г. Пермь
Сообщений: 4


Еще одно... Если в системе запущено несколько AutoCAD-ов, а мне известен Хэндл нужного, как мне получить именно этот объект?
Сейчас использую следующую конструкцию:
Код:
[Выделить все]
Acad := GetActiveOleObject('AutoCAD.Application.15') as IAcadApplication;
Но она находит первый запущенный. Как мне найти нужный?
Необходимо не только переключиться окнами, но и послать команду:
Код:
[Выделить все]
Acad.ActiveDocument.SendCommand('(command)(command)' + #13);
Igel вне форума  
 
Непрочитано 30.06.2005, 13:33
#6
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372


http://www.books.ru/shop/books/207838
ShaggyDoc вне форума  
 
Автор темы   Непрочитано 30.06.2005, 14:31
#7
Igel

Программирую под AutoCAD и не только.
 
Регистрация: 29.06.2005
г. Пермь
Сообщений: 4


Цитата:
Сообщение от ShaggyDoc
Оригинальный ответ, больше ничего говорить не буду.
Обидно конечно, когда на вопрос тебя посылают купить книжку, а там посмотрим.

А все-таки, народ, кто работал с СОМ-технологией, как найти конкретный СОМ-объект, что для этого нужно?
Igel вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Delphi+AutoCAD. Переключение между приложениями.