Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.12.2014, 12:45   #1
WhiskasTM
Подтвердите свой е-майл
 
Регистрация: 11.04.2012
Сообщений: 85
По умолчанию chm - Есть ли API для этой штуки?

В теории один файл справки Help.chm и в проге 4 меню: Помощь... Примеры... Уроки... Что Нового... Хэлп запускается при клике любого пункта(createprocess hh.exe с параметром на нужный топик), но если он уже запущен, то нужно заставить открытый chm перейти на соответствующий топик. При закрытии программы хэлп закрываться не должен (HtmlHelpW/A в пролете).

Убивать предыдущий процесс и делать новый пробовал, но там видно как окно исчезает... появляется... (анимация их палица).

WM_HELP_CHANGE_TOPIC, прочие message или в уже запущенный hh.exe отправить обновленный аргумент... Что-нибудь реально сделать?
WhiskasTM вне форума Ответить с цитированием
Старый 03.12.2014, 13:23   #2
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

В лазарусе есть компонент навигации по этому типу файла. На счет delphi не встречал.
Человек_Борща вне форума Ответить с цитированием
Старый 03.12.2014, 13:27   #3
WinCoder
Заблокирован
 
Регистрация: 24.11.2014
Сообщений: 721
По умолчанию

Человек_Борща Портировать думаю не проблема.
WinCoder вне форума Ответить с цитированием
Старый 03.12.2014, 17:09   #4
WhiskasTM
Подтвердите свой е-майл
 
Регистрация: 11.04.2012
Сообщений: 85
По умолчанию

Там он вроде не winapi-ишный если lhelp, другие на htmlhelp.

_____

Почти получилось. Меня выдает подмигивание окна(как будто долго грузит страницу), отсутствие щелчка(как сделать?) и этот таскбар(когда новое окно в семерке открывается там какое-то движение утрамбовка окон или что).

Код:
var
  HF : WideString;
  HW : HWND;
  HP : TProcessInformation;

procedure Help(const HtmlPage:WideString);
var
Topic        : WideString;
wndNoAnim    : BOOL;
newWindow    : HWND;
oldWindow    : HWND;
oldRect      : TRect;
oldPlace     : TWindowPlacement;
oldProcess   : TProcessInformation;
StartupInfo  : TStartupInfo;
HelpCode     : DWORD;
begin
Topic := HF+HtmlPage+'.htm';
GetExitCodeProcess(HP.hProcess,HelpCode);
if HelpCode<>STILL_ACTIVE then
begin
  ZeroMemory(@StartupInfo,SizeOf(TStartupInfo));
  StartupInfo.cb := SizeOf(TStartupInfo);
  StartupInfo.wShowWindow := SW_SHOWNORMAL;
  StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
  CreateProcessW(nil,PWideChar(Topic),nil,nil,False,0,nil,nil,StartupInfo,HP);
  repeat
    HW := FindWindow('HH Parent','My Help');
  until (GetWindowThreadProcessId(HW,HelpCode)=HP.dwThreadId) and (HelpCode=GetProcessId(HP.hProcess));
  Exit;
end;
oldProcess := HP;
oldWindow := HW;
GetWindowPlacement(oldWindow,@oldPlace);
if oldPlace.showCmd=SW_SHOWMINIMIZED then
begin
  SetForegroundWindow(oldWindow);
  ShowWindow(oldWindow,SW_SHOWNORMAL);
end;
GetWindowRect(oldWindow,oldRect);
ZeroMemory(@StartupInfo,SizeOf(TStartupInfo));
StartupInfo.cb := SizeOf(TStartupInfo);
StartupInfo.wShowWindow := SW_HIDE;
StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
CreateProcess(nil,PWideChar(Topic),nil,nil,False,0,nil,nil,StartupInfo,HP);
repeat
  HW := FindWindow('HH Parent','My Help');
until (GetWindowThreadProcessId(HW,HelpCode)=HP.dwThreadId) and (HelpCode=GetProcessId(HP.hProcess));
newWindow := HW;
wndNoAnim := True;
DwmSetWindowAttribute(oldWindow,DWMWA_TRANSITIONS_FORCEDISABLED,@wndNoAnim,SizeOf(BOOL));
wndNoAnim := True;
DwmSetWindowAttribute(newWindow,DWMWA_TRANSITIONS_FORCEDISABLED,@wndNoAnim,SizeOf(BOOL));
SetWindowPos(newWindow,HWND_TOP,oldRect.Location.X,oldRect.Location.Y,oldRect.Width,oldRect.Height,SWP_SHOWWINDOW);
PostMessage(oldWindow,WM_QUIT,0,0);
TerminateProcess(oldProcess.hProcess,0);
CloseHandle(oldProcess.hProcess);
CloseHandle(oldProcess.hThread);
wndNoAnim := False;
DwmSetWindowAttribute(newWindow,DWMWA_TRANSITIONS_FORCEDISABLED,@wndNoAnim,SizeOf(BOOL));
sndPlaySoundW(PWideChar('C:\Windows\Media\Windows Navigation Start.wav'),SND_SYNC);
end;

initialization
HF := 'C:\Windows\hh.exe '+ExtractFilePath(Application.ExeName)+'help\Docs.chm::/';

Последний раз редактировалось WhiskasTM; 03.12.2014 в 19:25.
WhiskasTM вне форума Ответить с цитированием
Старый 03.12.2014, 18:11   #5
JUDAS
фонатик DELPHI
Форумчанин
 
Аватар для JUDAS
 
Регистрация: 14.01.2008
Сообщений: 714
По умолчанию

Код:
unit uChmView;
interface
uses Windows, Messages, SysUtils;
type
    TAssignChm = class
    private
        lHelpWnd   : HWND;     // хендл окна справки
        bCalled    : LongBool; // справка была вызвана и не была закрыта программно
        sClassName : string;   // имя класса окна справки
        sFileLink  : string;   // ссылка, содержащая полное имя файла справки
        procedure SetFileName(const sFile:string);
        function  _GetClass():string;
    public
        constructor Create(const AFileName:string = '');
        destructor  Destroy(); override;
        procedure   ShowHelp(const APage : string = '');
        procedure   CloseWnd();
    end;


implementation
uses Forms;

 function HtmlHelp(hWnd: HWND; pszFile: PChar; uCommand: Cardinal; dwData: Cardinal): HWND; stdcall;
  external 'hhctrl.ocx' name 'HtmlHelpA';

constructor TAssignChm.Create(const AFileName: string='');
begin
   inherited Create;
   SetFileName(AFileName);
   bCalled := false;
   lHelpWnd := 0;
   sClassName := '';
end;

destructor TAssignChm.Destroy;
begin
   CloseWnd();
   inherited;
end;

//возвращает имя класса окна lHelpWnd
function TAssignChm._GetClass:string;
begin
   SetLength(result,256);
   FillChar(result[1], 256, 0);
   GetClassName(lHelpWnd,@result[1],255);
   result := Trim(result);
end;

//установка имени файла и ссылки на файл
procedure TAssignChm.SetFileName(const sFile: string);
begin
  sFileLink := 'mk:@MSITStore:'+StringReplace(sFile, #32, '%20', [rfReplaceAll]);
  if sFile='' then sFileLink := '';
end;


//выводит окно справки на указанной странице (или на странице по-умолчанию)
procedure TAssignChm.ShowHelp(const APage: string='');
var sTmp:string;
begin
  sClassName:='';
  case APage='' of
   true : sTmp := sFileLink+'::/';
   false: sTmp :=StringReplace(sFileLink+'::/'+StringReplace(APage,#32,'%20',[rfReplaceAll]),'\','/',[rfReplaceAll])+'.htm';
  end;
  lHelpWnd := HtmlHelp(Application.handle,PChar(sTmp),0,0);
  bCalled  := lHelpWnd<>0;
  if bCalled then sClassName:=_GetClass();
end;

//закрывает окно справки, если оно еще не было закрыто юзером
procedure TAssignChm.CloseWnd;
begin
   if bCalled and (lHelpWnd<>0) and (_GetClass()=sClassName) then
   begin
      SendMessage(lHelpWnd,WM_CLOSE,0,0);
      lHelpWnd   := 0;
      bCalled    := false;
      sClassName := '';
   end;
end;

end.
95% сбоев и ошибок приложений, находится в полу метрах от монитора
JUDAS вне форума Ответить с цитированием
Старый 03.12.2014, 18:20   #6
JUDAS
фонатик DELPHI
Форумчанин
 
Аватар для JUDAS
 
Регистрация: 14.01.2008
Сообщений: 714
По умолчанию

вызов:

Код:
with TAssignChm.Create('C:\бла_бла\ Help.chm') do
try
  ShowHelp('idn_XXXX'); // идентификатор раздела устанавливается в help workshop*
finally
  Free;
end;
help workshop* - программа для создания компиляции и коррекции справки
95% сбоев и ошибок приложений, находится в полу метрах от монитора
JUDAS вне форума Ответить с цитированием
Старый 03.12.2014, 19:48   #7
WhiskasTM
Подтвердите свой е-майл
 
Регистрация: 11.04.2012
Сообщений: 85
По умолчанию

JUDAS, HtmlHelpA для PChar? И закроется в любом случае.

На x64 эту HtmlHelp на полную юзать нереально, посылаемый параметр вместе HH_BLAH_BLAH ради плюшек - dword, и внутри все dword, и указатели 32бит, плясать с конвертацией желания нет.

Хотя либа под 64 есть вроде в SDK. Closed. Код поправил на память.
WhiskasTM вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
txt2html конвертер для создания chm-файлов alexBlack Софт 8 22.09.2016 12:28
Подключение функции Html для chm-справок Balthazar Общие вопросы Delphi 3 15.12.2011 13:08
Есть несложная работа (delphi 7, Google API) - 20$ wedoon Фриланс 3 11.10.2011 14:22
Справка CHM для программы apromix Общие вопросы Delphi 0 19.05.2008 13:31
для этой штуки нужны тригеры и курсоры. zinnyrik БД в Delphi 4 15.05.2007 14:47