господа , есть такая проблема если вызвать subj и установить hookfunction а потом в ней попытаться воздествовать на контролы диалога - то поучается фигня - ноль эмоций в частности я пытался удалить любой из контролов ничего не происходит EnableWindow, Showwindow,Destroywindow возвращает когда true , когда false но результата нет никакого при fail getlasterroк возвращает 0 хук работает , функции вызываются, цеплялся к wm_initdialog, wm_showwindow, wm_paint - всё без толку если кто управлял этим диалогом, помогите пожалуйста, что я не так делаю ? код на паскале могу запостить , но он тривиален и делает именно то что я и сказал
staier Этот диалог создан из шаблона (ресурса), возможно проблема из-за этого. Текст то хоть можно менять на контролах?
это не пробовал , мне это не нужно было но не думаю что шаблон - это проблема большинство диалогов созданы из ресурсов и что это меняет ? задисэйблить кнопку что ли нельзя?
Хотя нет, все должно изменяться, вот пример созданый из одной моей проги: Код (Text): procedure xtproc(x:pointer); var h, hh: THandle; begin h := 0; while h = 0 do begin sleep (100); h := FindWindow (nil, 'Open Trainer'); end; // MessageBox (h, 'MB Found', 'eat', MB_OK); SetWindowText (h, 'Close Trainer'); hh := FindWindowEx (h, 0, 'Button', 'Отмена'); if hh <> 0 then ShowWindow (hh, SW_HIDE); end; var s: string; fn: array [0..256] of char; ofn: tagOFN; afx: dword; begin s := ParamStr (1); InitComCtrls; if s = '' then begin ZMem (ofn, sizeof (ofn)); // fill zerro ofn.lStructSize := sizeof (ofn); ofn.hInstance := hInstance; ofn.lpstrFilter := 'Text trainer description'#0'*.ttd'#0#0; ofn.lpstrInitialDir := PChar (GetCurrentDir); ofn.lpstrTitle := 'Open Trainer'; ofn.Flags := OFN_FILEMUSTEXIST or OFN_PATHMUSTEXIST; ofn.lpstrFile := fn; ofn.nMaxFile := 256; CloseHandle ( CreateThread (nil, 1000, @xtproc, nil, 0, afx) ); GetOpenFileName (ofn); end; end; Убирает кнопку отмена, и меняет заголовок диалога
ага, спасибо, это работает к тому же проще получается чем использую родную hookfunction интересно , почему всё же если поставить всё тоже самое в ofn.lpfnhook то ни хрена не работает Код (Text): function hook(Wnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): UINT stdcall; var h, hh: THandle; begin result:= 0; case msg of wm_Showwindow,Wm_initDialog,Wm_Command: begin SetWindowText (wnd, 'Close Trainer'); hh := FindWindowEx (wnd, 0, 'Combobox', ''); if hh <> 0 then ShowWindow (wnd, SW_HIDE); hh := FindWindowEx (wnd, 0, 'ToolbarWindow32', ''); if hh <> 0 then ShowWindow (hh, SW_HIDE); result:= 1; end; end ; end; var s: string; fn: array [0..256] of char; ofn: tagOFN; afx: dword; begin s := ParamStr (1); // InitCommonCtrls; if s = '' then begin Zeromemory(@ofn, sizeof (ofn)); // fill zerro ofn.lStructSize := sizeof (ofn); ofn.hInstance := hInstance; ofn.lpstrFilter := 'Text trainer description'#0'*.ttd'#0#0; ofn.lpstrInitialDir := PChar (GetCurrentDir); ofn.lpstrTitle := 'Open Trainer'; ofn.Flags := OFN_FILEMUSTEXIST or OFN_PATHMUSTEXIST or Ofn_Explorer or OFN_ENABLEHOOK; ofn.lpfnHook :=@hook; ofn.lpstrFile := fn; ofn.nMaxFile := 256; // CloseHandle ( // CreateThread (nil, 1000, @xtproc, nil, 0, afx) ); GetOpenFileName (ofn); end;
Вот вроде и правильный код (Used MSDN2003): Код (Text): var h, hh: THandle; function hook(hdlg: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): UINT; STDCALL; begin // MessageBox (h, 'MB Found', 'eat', MB_OK); result:= 0; if WM_INITDIALOG = msg then h := GetParent (hdlg); // { hdlg - Handle to the child dialog box of the Open or Save As dialog box. Use the GetParent function to get the handle to the Open or Save As dialog box. } if h <> 0 then case msg of WM_SHOWWINDOW: begin SetWindowText (h, 'Close Trainer'); hh := FindWindowEx (h, 0, 'Combobox', nil); if hh <> 0 then ShowWindow (wnd, SW_HIDE); hh := FindWindowEx (h, 0, 'ToolbarWindow32', nil); if hh <> 0 then ShowWindow (hh, SW_HIDE); result:= 1; end; end ; end;