Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

вопрос по EnumThreadWindows [D6, XP]


Elen ©   (2007-07-31 11:44:00) 

Задача : нужно из моей программы запустить Ворд, открыть в нем файл и найти все окна в нем. Для этого использую CreateProcess потом EnumThreadWindows. Если до этого Ворд не был открыт, Enum правильно мне возвращает списочек окон, если же уже открыты какие-либо доки то Enum работать не хочет. Вот код :

unit Unit1;

interface

uses        shellapi,  
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls;

type
 TForm1 = class(TForm)
   ListBox1: TListBox;
   procedure FormCreate(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;
     function Enum(h:THandle;l:integer):boolean; stdcall;

var   ProcessInf:_PROCESS_INFORMATION;
           StartInfo:_STARTUPINFOA;
 Form1: TForm1;

implementation

{$R *.dfm}

function Enum;
 //********** FUNCTION **********
function WindowClass(wind:hwnd):string;

var Nm:Array[0..255] of Char;
begin
   nm:='';
   GetClassName(Wind,Nm,sizeof(nm)); // ñ÷èòûâàåì  òåêñò çàãîëîâêà îêíà
   result:=string(nm);
end;
//********** END FUNCTION ******
begin
form1.ListBox1.Items.Add(WindowClass(h));
result:=true;
end;

procedure TForm1.FormCreate(Sender: TObject);
var i:integer; d:Cardinal;
       //********** END FUNCTION ******  {}
     function OpenFileProcess(filea:string):cardinal;
       var exc:pchar; cdir:string;
       begin
        getmem(exc,2550);
       FindExecutable(pchar(filea),pchar(cdir),exc);
        cdir:=ExtractFilePath(filea);
        if not CreateProcess(exc,pchar(exc+' "'+filea+'"'),0,0,
        false,0,nil,pchar(cdir),StartInfo,ProcessInf) then
         RaiseLastWin32Error;
       freemem(exc);
        result:=ProcessInf.dwThreadId;
       end;
       //**************************************************************************
begin
d:=OpenFileProcess('c:\temp\q.doc');
sleep(1001);
enumThreadWindows(d,@Enum,0);

end;

end.


Думается это потому что новооткрытый Ворд и те которые уже открыты находятся в одной треаде.

Вопрос : как мне получить все окна запущенного мнойВорда?
Просто EnumWindows не желательно, т.к. будущий капшин открывающегося дока я могу и не определить.

Заранее спасибо.


Elen   (2007-07-31 13:36:00) [1]


> oxffff ©   (31.07.07 13:15) [15]

Как раз его прорабатываю. А насчет OCX это огромное пасибо.


oxffff   (2007-07-31 13:17:00) [2]

Word Viewer OCX 2.0

http://ruloads.com/dev/activex/16204prog.html


oxffff   (2007-07-31 13:15:00) [3]

Может поможет

Google WordView

The WordVIEW toolkit VIs use ActiveX automation to implement all the basic tasks required to create, edit and manage Word documents.  

Или скачать Word Viewer от Microsoft. И попробовать там свои HackELEN методы.


Elen   (2007-07-31 13:09:00) [4]

Эх. чеж делать...


Сергей М.   (2007-07-31 13:03:00) [5]

Никак.

Рич не работает с нативными вордовыми документами.


Elen   (2007-07-31 12:58:00) [6]

А как в Риче открыть документ ворда таким как он есть с форматированием с картинками и таблицами?


Elen   (2007-07-31 12:37:00) [7]

Верно. Ща попробую. Тут другая трабла - откроет ли Рич доки, где форматирование нестандартное, плюс рисунки, ну и всякие ворд-выкрутасы... В общем буду пробовать, если что напишу.


Сергей М.   (2007-07-31 12:30:00) [8]


> Создавать временный файл


Можно и не создавать, работая ченез IStream


Elen   (2007-07-31 12:27:00) [9]

Тоже идея. т.е. Создавать временный файл, его открывать Ричем...
Ща попробую, но если тормозить будет то...


Сергей М.   (2007-07-31 12:23:00) [10]


> с ним работать не удобно, да и отображение у него ужасное


Если вы не любите кошек, то вряд ли вы умеете их готовить)

Ну а что, к примеру, мешает использовать Ворд заставляя его конвертировать интересующий документ в RTF-формат с целью визуализации средствами компонента TRichView ?


Elen   (2007-07-31 12:21:00) [11]


> TWebBrowser?

Пробовали. Тормозит неподетски :(

Кстати вот по поводу OLEContainer - тут какая-то трабла, которую я не могу обьяснить: На некоторых компах при CreateLinkToFile не отоброжение происходит, а просто иконка показывается, а открывать запрещено.


clickmaker   (2007-07-31 12:18:00) [12]


> [3] Elen ©   (31.07.07 12:06)

TWebBrowser?


Elen   (2007-07-31 12:18:00) [13]


> Сергей М. ©   (31.07.07 12:11) [4]

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

> umbra ©   (31.07.07 11:53) [2]

А что мне дает эта функа? только запуск?


Сергей М.   (2007-07-31 12:11:00) [14]


> через OLEContainer плохо


Почему ?


Elen   (2007-07-31 12:06:00) [15]


> Зачем они тебе понадобились, можно полюбопытствовать ?

Можно. В общем если в кратце, это один из вариантов просмотра доковских файлов. Идея проста - запустить ворд, найти хендл его окна, допустим главного и изменить ему родителя, т.е. сделать его дитем моей формы.

Общая задача - просмотр документов офиса без возможности редактирования. Можно написать макрос к ворду чтоб запретить редактировать, но еще хотелось бы вставить окно ворда в мою форму как дочерней. Компонента, который позволил бы это делать я не нашла, а через OLEContainer плохо.

Насчет ShellExecuteEx я как раз пробую, но если знаете еще способы решить общую задачу подскажите.


umbra   (2007-07-31 11:53:00) [16]

ShellExecuteEx?


Сергей М.   (2007-07-31 11:52:00) [17]


> как мне получить все окна запущенного мной Ворда?


Зачем они тебе понадобились, можно полюбопытствовать ?


Наверх

Титульная страница Поиск, карта сайта Написать письмо