![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
вопрос по 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]
> как мне получить все окна запущенного мной Ворда?
Зачем они тебе понадобились, можно полюбопытствовать ?