Страница 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"
если не трудно.