Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Открыть файл типа PowerPoint, НЕ то, о чём уже много раз говорили!!! 
:(
    Опции темы
Олечка85
  Дата 25.7.2006, 00:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 19.6.2006
Где: Berlin

Репутация: нет
Всего: нет



Дорогие эксперты!

Подскажите, please, как открыть файл вида *.pps и проследить, когда он закроется!

Пробовала сделать через ShellExecute, но тогда не могу проследить, закрылся ли Поверпойнт (мне нужно проследить кол-во нажатий клавиш во время просмотра презентации)

Пробовала сделать через CreateProcess, но там нужно указать тип программы, которой открывать файл, а с Просмотром-Презентацией так не получается (либо открывается сам Поверпойнт, либо просмотровая прога, но она запрашивает имя презентации, а не открывает то, что надо, сразу)

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

А! Ещё пробовала через ОЛЕ-объект, выдаётся ошибка "The PowerPoint Frame does not exist"... Раньше с такого типа вещами не работала, та что не знаю, что сие значит...  smile  
PM MAIL ICQ   Вверх
Alexeis
Дата 25.7.2006, 00:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 16
Всего: 459



Цитата(Олечка85 @  25.7.2006,  00:37 Найти цитируемый пост)
Пробовала сделать через ShellExecute, но тогда не могу проследить, закрылся ли Поверпойнт (мне нужно проследить кол-во нажатий клавиш во время просмотра презентации)

Попробуйте ShelExecuteEx + WaitForSingleObject
Второе позволяет подождать пока объект (программа не закроется).  ShelExecuteEx - дает дополнительную информацию о потоке.

Добавлено @ 00:46 
Цитата(Олечка85 @  25.7.2006,  00:37 Найти цитируемый пост)
(мне нужно проследить кол-во нажатий клавиш во время просмотра презентации

А это уже из другой области, здесь надо Хук ставить, на все нажатия клавиш, затем их считать и отослать сообщение о нужном количестве сообщений.
Правда для этого в программе понадобится открыть второй поток, поскольку один приостоновит свою работу выполняя WaitForSingleObject, и тем самым не даст обработать полученное сообщение. 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Олечка85
Дата 25.7.2006, 01:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 19.6.2006
Где: Berlin

Репутация: нет
Всего: нет



Цитата(alexeis1 @  25.7.2006,  00:42 Найти цитируемый пост)
Попробуйте ShelExecuteEx + WaitForSingleObject


Попробовала smile)))))))))) Удалось перезагрузить весь Виндоуз...

Написала так:
Код

if OpenDialog1.execute then

    begin
       FillChar(sei, SizeOf(sei), 0);
       sei.cbSize := SizeOf(sei);
       sei.lpFile := PChar(OpenDialog1.Filename);
       sei.lpVerb := '';
       sei.fMask := SEE_MASK_INVOKEIDLIST;
       ShellExecuteEx(@sei);
       WaitForSingleObject(sei.fMask, INFINITE);
       ShowMessage('Готово!');
    end;


Не нашла, какие параметры ставить в WaitForSingleObject в этом случае, попробовала разные... В общем, система перезагрузилась.
 smile   

Это сообщение отредактировал(а) Олечка85 - 25.7.2006, 10:46
PM MAIL ICQ   Вверх
Alexeis
Дата 25.7.2006, 01:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 16
Всего: 459



вот так  получилось smile 
Код

procedure TForm1.btn1Click(Sender: TObject);
var
  p2  : TShellExecuteInfo;

begin
if OpenDialog1.execute then
    begin
      FillChar(p2, SizeOf(p2), 0);
      With p2
      do
        Begin
          cbSize  := SizeOf(p2);
          fMask   := SEE_MASK_NOCLOSEPROCESS;
          Wnd     := Handle;
          lpVerb  := 'open';
          nShow   := SW_SHOWNORMAL;
          lpFile  := PChar(OpenDialog1.FileName);
          lpDirectory := PChar(ExtractFileDir(OpenDialog1.FileName));
        end;

        ShellExecuteEx(@p2);
        WaitforSingleObject(p2.hProcess, INFINITE);
        ShowMessage('Готово!');
    end;
end;
  

Это сообщение отредактировал(а) alexeis1 - 25.7.2006, 01:55


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
dumb
Дата 25.7.2006, 02:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 7
Всего: 158



но есть один нюанс... (с) smile
Цитата

hProcess
Handle to the newly started application. This member is set on return and is always NULL unless fMask is set to SEE_MASK_NOCLOSEPROCESS. Even if fMask is set to SEE_MASK_NOCLOSEPROCESS, hProcess will be NULL if no process was launched. For example, if a document to be launched is a URL and an instance of Microsoft Internet Explorer is already running, it will display the document. No new process is launched, and hProcess will be NULL.

Note ShellExecuteEx does not always return an hProcess, even if a process is launched as the result of the call. For example, an hProcess does not return when you use SEE_MASK_INVOKEIDLIST to invoke IContextMenu.


так что в данном случае, наверное, лучше использовать FindExecutable и CreateProcess.
ключ командной строки PowerPoint'а для "показа" - "/s". 
PM MAIL   Вверх
Олечка85
Дата 25.7.2006, 11:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 19.6.2006
Где: Berlin

Репутация: нет
Всего: нет



Цитата(alexeis1 @  25.7.2006,  01:47 Найти цитируемый пост)
вот так  получилось smile

У меня было наподобие этого, но поробовала и твой вариант.
Результат тот же - сообщение "Готово" высвечивается не после того, как презентация закроется, а после того. как ОТКРОЕТСЯ, т.е. как процесс воспринимается... открытие файла?

Добавлено @ 12:02 
Цитата(dumb @  25.7.2006,  02:07 Найти цитируемый пост)
ключ командной строки PowerPoint'а для "показа" - "/s".


Попробовала вот так:
Код


if OpenDialog1.execute then

    begin
        FillChar( Si, SizeOf( Si ) , 0 );

        with Si do
        begin  
           cb := SizeOf( Si);
           dwFlags := startf_UseShowWindow;
           wShowWindow := 4;
        end;

        Createprocess('/s', PChar(OpenDialog1.FileName) , nil, nil,false, Create_default_error_mode, nil, nil, si, p);
        Waitforsingleobject(p.hProcess, infinite);

        ShowMessage('Презентация просмотрена');
        close;
     end;


Презентация не запускается совсем, сразу сообщение о том, что она просмотрена... 
PM MAIL ICQ   Вверх
Alexeis
Дата 25.7.2006, 13:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 16
Всего: 459



Цитата(Олечка85 @  25.7.2006,  11:57 Найти цитируемый пост)
Результат тот же - сообщение "Готово" высвечивается не после того, как презентация закроется,

Cтранно, у меня все работает - видимо дело в настройках офиса.
Для запуска придется указать еще и путь к powerpoint
Код

procedure TForm1.FormCreate(Sender: TObject);
var
  Si : TStartupInfo;
  p : TProcessInformation ;
begin
if DlgOpen1.execute
then
    begin
        FillChar(Si, SizeOf(Si) , 0);

        with Si do
        begin
          cb := SizeOf(Si);
          dwFlags := startf_UseShowWindow;
          wShowWindow := 4;
        end;

        Createprocess('C:\Program Files\Microsoft Office\Office\POWERPNT.EXE',
                      PChar(DlgOpen1.FileName + ' /s') , nil, nil,
                      false, Create_default_error_mode, nil, nil,
                      si, p);
        Waitforsingleobject(p.hProcess, infinite);

        ShowMessage('Презентация просмотрена');
        close;
     end;
end;
 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Олечка85
Дата 25.7.2006, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 19.6.2006
Где: Berlin

Репутация: нет
Всего: нет



Цитата(alexeis1 @  25.7.2006,  13:23 Найти цитируемый пост)
Для запуска придется указать еще и путь к powerpoint

Та же штука. Сообщение появляется сразу после открытия поверпойнта.

Пробовала открывать не POWERPNT.exe, а сразу PPTVIEW.exe, получается лучше, т.к. мне надо на просмотр, но... после показа одной презентации требуют выбрать следующую и получается, что этот PPTVIEW.exe надо выключать вручную smile

Добавлено @ 13:49 
Цитата(alexeis1 @  25.7.2006,  13:23 Найти цитируемый пост)
PChar(DlgOpen1.FileName + ' /s'

А где можно найти инфу об этих буковках, мне кажется, для PPTVIEW.exe нужна какая-то другая... smile 
 
PM MAIL ICQ   Вверх
Alexeis
Дата 25.7.2006, 13:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 16
Всего: 459



Цитата(Олечка85 @  25.7.2006,  13:47 Найти цитируемый пост)
Та же штука. 

А если powerpoint был перед этим закрыт?

Добавлено @ 13:54 
Цитата(Олечка85 @  25.7.2006,  13:47 Найти цитируемый пост)
А где можно найти инфу об этих буковках, мне кажется, для PPTVIEW.exe нужна какая-то другая... 

HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Applications\POWERPNT.EXE\shell\Show
 Анологично
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Applications\PPTVIEW.exe\shell\Show
 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Олечка85
Дата 25.7.2006, 14:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 19.6.2006
Где: Berlin

Репутация: нет
Всего: нет



Цитата(alexeis1 @  25.7.2006,  13:50 Найти цитируемый пост)
А если powerpoint был перед этим закрыт?

Проверила ещё раз. С закрытым. То же. smile 

"буковки" для первого я нашла, а вот для второго - нет там такого... Но спасибо за инфу, буду "там поискать"  smile  
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.1321 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.