Страница 1 из 2

как запретить появление формы зная ее имя

Добавлено: 14 мар 2007, 18:42
namomelkor
Ситуация слудеющая :
юзаю компонент активиксовский который перед показом моей формы показывает свой диалог типа эбаут нужно сделать так чтобы пользователь его не видел.

причем эта неприятность происходит до Application.CreateForm(TForm1, Form1);

Re: как запретить появление формы зняя ее имя

Добавлено: 15 мар 2007, 08:48
Blood_Magic
Найди ее с помощью FindWindow и закрой

Re: как запретить появление формы зняя ее имя

Добавлено: 15 мар 2007, 10:16
BBB
Можно попробовать с помощью "хука", "подвесившись" на создание окна. Посмотеть Spy-ем, какое у этого окна (формы) название класса и/или заголовок и запретить (в "хуке") его создание.

Re: как запретить появление формы зняя ее имя

Добавлено: 15 мар 2007, 12:31
namomelkor
BBB писал(а):Можно попробовать с помощью "хука", "подвесившись" на создание окна. Посмотеть Spy-ем, какое у этого окна (формы) название класса и/или заголовок и запретить (в "хуке") его создание.
А по подробней можно?

Re: как запретить появление формы зняя ее имя

Добавлено: 15 мар 2007, 12:59
BBB
Честно говоря, я это дело (сам хук) на C++ писал.
Еще тонкость: неизвестно, как то приложение, которое пытается создать это окно, отреагирует на то, что создать его не удалось. Может, у него логика такая, что оно после этого дальше ничего делать не захочет и тут же закроется.

Код: Выделить всё

#include <Windows.H>

 //-------------------------------

const char acHooked_WinClassName [] = "??????????",
         char acHooked_WinTitle [] = "?????????";
HINSTANCE hInst;
HHOOK hHook = NULL;


 //======================================================

LRESULT CALLBACK MyHook_CBTProc (
  int nCode,      // hook code
  WPARAM wParam,  // depends on hook code
  LPARAM lParam   // depends on hook code
){

 LRESULT iRes;
 int cxSCREEN, cySCREEN;
 //---------------

  switch (nCode) {

    case HCBT_CREATEWND :

      if (lParam) {
        if (((LPCBT_CREATEWND)lParam)->lpcs) {
         static char acWinClName [512];
         HWND hw = (HWND)wParam;
         //-------------------------------

          if (GetClassName (hw, acWinClName, sizeof (acWinClName) - 1) > 0) {

            if ((lstrcmp (acHooked_WinClassName, acWinClName) == 0) &&
                (lstrcmp (acHooked_WinTitle, ((LPCBT_CREATEWND)lParam)->lpcs->lpszName) == 0)) {
              // Запрещаем окну создаваться:
              // If the hook procedure returns a nonzero value,
              // the system destroys the window;
              // the CreateWindow function returns NULL, but
              // the WM_DESTROY message is not sent to the window.
               return (1);
            };
          };
        };
      };

     // "Вызываем по цепочке"
      iRes =
        CallNextHookEx (
          hHook, // HHOOK hhk,      // handle to current hook
          nCode,      // hook code passed to hook procedure
          wParam,  // value passed to hook procedure
          lParam   // value passed to hook procedure
                 );
      return (iRes);

    default :
     // "Вызываем по цепочке"
      return (
        CallNextHookEx (
          hHook, // HHOOK hhk,      // handle to current hook
          nCode,      // hook code passed to hook procedure
          wParam,  // value passed to hook procedure
          lParam   // value passed to hook procedure
                 )
       );

  };  // switch (nCode)
};  // MyHook_CBTProc

 //======================================================

extern "C"
void __declspec(dllexport) DoHook (void)
{

  if (hHook == NULL) {
    hHook = SetWindowsHookEx (
      WH_CBT, // int idHook,        // hook type
      (HOOKPROC)MyHook_CBTProc, // HOOKPROC lpfn,     // hook procedure
      hInst, // HINSTANCE hMod,    // handle to application instance
      0  // DWORD dwThreadId   // thread identifier
    );
  };  // if (hHook == NULL)

};  // DoHook

 //------------------------------------

extern "C"
void __declspec(dllexport) DoUnHook (void)
{
  if (hHook != NULL) {
    if (UnhookWindowsHookEx (hHook))
      hHook = NULL;
  }
};  // DoUnHook

 //-------------------------------
 //------------------------------------

BOOL WINAPI DllMain (HINSTANCE hInstance,
                     DWORD  Reason, 
                     LPVOID Reserved
                                         )
{

  switch(Reason) {
   //Register messages on creation (not needed but to be safe :) )
    case DLL_PROCESS_ATTACH:
      hInst = hInstance;
    return TRUE;

    //When disconnected then detach from the hook
    case DLL_PROCESS_DETACH:
      DoUnHook ();
    return TRUE;
  };  // switch(Reason)
  return TRUE;

};  // DllMain
Значениями acHooked_WinClassName и acHooked_WinTitle подставляешь нужные имена. Условие запрете создания окна можно "по вкусу" поменять, чтобы, например, реагировать только на название класса окна или только на заголовок окна.

Microsoft пишет, что хук-процедцра ДОЛЖНА находиться во внешней DLL, так что без создания DLL все равно не обойтись.

Соответственно, в своей программе перед "критическим участком" вызываешь функцию DoHook, а когда необходимость в хуке отпадет, то DoUnHook.

Re: как запретить появление формы зняя ее имя

Добавлено: 15 мар 2007, 13:18
namomelkor
Да но тут еще прикол в том что окно вызавается до FormCreate точнее до всех моих строк
Application.Initialize;
Application.Title := 'FTP';
Application.CreateForm(TForm1, Form1); //тут жмакаю F7 и сразу вылазит окно а после его закрытия уже происходит вся инициализация
Application.Run;

Re: как запретить появление формы зняя ее имя

Добавлено: 15 мар 2007, 13:22
BBB
А что мешает вызвать установку хука до вызова Application.CreateForm?

Re: как запретить появление формы зняя ее имя

Добавлено: 15 мар 2007, 17:53
namomelkor
чето не получается компильнуть библиотеку

Re: как запретить появление формы зняя ее имя

Добавлено: 15 мар 2007, 17:59
BBB
namomelkor писал(а):чето не получается компильнуть библиотеку
А поконкретнее? (Я компилировался MS VC++ 6.0)

Re: как запретить появление формы зняя ее имя

Добавлено: 15 мар 2007, 18:16
namomelkor
мммммм.... У меня 2005-я студия. 6-го нет. А библиотеку выложеть сюда можешь?
Caption окна "About FolderView Control"
Caption второго окна "About FileView Control"


если не трудно.