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

Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду

namomelkor
Сообщения: 230
Зарегистрирован: 31 авг 2006, 13:11

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

причем эта неприятность происходит до Application.CreateForm(TForm1, Form1);
Blood_Magic
Сообщения: 273
Зарегистрирован: 30 июн 2005, 14:53

Найди ее с помощью FindWindow и закрой
- Чем юзер похож на обезьяну?
- Он жмет на все, что жмется, дергает все, что дергается и крутит все, что крутится.
- Чем юзер отличается от обезьяны?
- У обезьяны хватает ума не воспроизводить ту последовательность, которая приводит к краху системы.
BBB
Сообщения: 1298
Зарегистрирован: 27 дек 2005, 13:37

Можно попробовать с помощью "хука", "подвесившись" на создание окна. Посмотеть Spy-ем, какое у этого окна (формы) название класса и/или заголовок и запретить (в "хуке") его создание.
namomelkor
Сообщения: 230
Зарегистрирован: 31 авг 2006, 13:11

BBB писал(а):Можно попробовать с помощью "хука", "подвесившись" на создание окна. Посмотеть Spy-ем, какое у этого окна (формы) название класса и/или заголовок и запретить (в "хуке") его создание.
А по подробней можно?
BBB
Сообщения: 1298
Зарегистрирован: 27 дек 2005, 13:37

Честно говоря, я это дело (сам хук) на 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.
namomelkor
Сообщения: 230
Зарегистрирован: 31 авг 2006, 13:11

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

А что мешает вызвать установку хука до вызова Application.CreateForm?
namomelkor
Сообщения: 230
Зарегистрирован: 31 авг 2006, 13:11

чето не получается компильнуть библиотеку
BBB
Сообщения: 1298
Зарегистрирован: 27 дек 2005, 13:37

namomelkor писал(а):чето не получается компильнуть библиотеку
А поконкретнее? (Я компилировался MS VC++ 6.0)
namomelkor
Сообщения: 230
Зарегистрирован: 31 авг 2006, 13:11

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


если не трудно.
Ответить