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

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

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.12.2006, 18:52   #1
Nowichok
Пользователь
 
Регистрация: 23.11.2006
Сообщений: 53
По умолчанию Создание окна через CreateWindowEx

Хочу создать окно, которое будет содержать какой-то текст...ничего более. Мои цели :
1) Окно должно быть ПОВЕРХ всех окон
2) Не должно содержать названия (т.е. нужен просто текст.... как св-во BorderStyle=bsNonе)
3) После создания через 2 секунды оно должно уничтожиться/скрыться.... (окно будет периодически показываться)
4) Желательно ещё, чтобы можно было менять цвет фона окна.

На данный момент пытаюсь сделать окно класса Static. (вроде бы подходит под мои требования.)
Пишу :
Код:
 CreateWindowEx(
  WS_EX_TOPMOST,  //поверх всех
  'STATIC',
  WinName,   // const   WinName = 'MainWClass';
  SS_Center,
  // стандартные горизонтальное, вертикальное положение, ширина и высота
  Integer(CW_USEDEFAULT),
  Integer(CW_USEDEFAULT),
  Integer(CW_USEDEFAULT),
  Integer(CW_USEDEFAULT),
  0,//нет родительского окна
  0,//нет меню
  hInstance, // handle to application instance
  nil); // no window-creation data
По 3-му пункту : окно создаётся в dll-ке, поэтому я не знаю, как быть..яж там никуда никакой компонент не запихну ,типа TTimer ((
В общем, подскажите, как выполнить 2-4 пункты ? !!!
Nowichok вне форума Ответить с цитированием
Старый 10.12.2006, 16:37   #2
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

цвет фона изменяется, но только при создании
Код:
 wc.hbrBackground:=COLOR_BTNFACE;
COLOR_BTNFACE - цвет

чтобы оно могло скзакрыться через некоторое время делай так
Код:
procedure Delay;
var ev:THandle;
    name:string; 
begin
 name:=IntToStr(random(1000000));
 ev:=CreateEvent(nil,true,false,pchar(name));
 WaitForSingleObject(ev,DelayTime);
 CloseHandle(ev);
end;
удали стоки
Код:
While GetMessage(Mesg,0,0,0) do
 begin
  TranslateMessage(Mesg);
  DispatchMessage(Mesg);
 end;
вместо них напиши вот это
Код:
     Delay(2000);
     exitprocess(0);
только перед этим нормально обнови своё окно потому что потом оно не будет обновляться и сразу закроется
rpy3uH вне форума Ответить с цитированием
Старый 10.12.2006, 16:48   #3
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

чтобы оно не имело границы копайся со стилями окна
Код:
MainWnd:=CreateWindowEx (
0,                    //ôëàãè ðàñøèðåííûõ ñòèëåé !!!!!!!!!!!!!!!!!!!!!!!
.....
0, //ôëàãè ñòèëåé îêíà !!!!!!!!!!!!!!!!!
.......
);
и
Код:
wc.style:=........;
смотри в справке описание флагов стилей окна
rpy3uH вне форума Ответить с цитированием
Старый 10.12.2006, 18:21   #4
Nowichok
Пользователь
 
Регистрация: 23.11.2006
Сообщений: 53
По умолчанию

Буду эксперементировать со стилями...сразу как разберусь с тем, как вообще окно создать. Грабли на самом простом

..что-то то-ли я туплю, то ли.... :
Код:
 var
  hwndMain: THandle;
  wc : TWndClassEx;
.......
 wc.cbSize:=sizeof(wc);
wc.style:=cs_hredraw or cs_vredraw;
wc.lpfnWndProc:=@WindowProc; //функция, описана
wc.cbClsExtra:=0;
wc.cbWndExtra:=0;
wc.hInstance:=HInstance;
wc.hIcon:=LoadIcon(0,idi_application);
wc.hCursor:=LoadCursor(0,idc_arrow);
wc.hbrBackground:=COLOR_BTNFACE+1;
wc.lpszMenuName:=nil;
wc.lpszClassName:='My';

if RegisterClassEx (Wc) = 0 then
  MessageBox (0, 'Invalid class registration',
  'Error', MB_OK);

hwndMain := CreateWindowEx(
  WS_EX_TOPMOST,
  wc.lpszClassName,  / 'My' как вариант...
  WinName,   // const   WinName = 'MainWClass';
  WS_POPUP,
  Integer(CW_USEDEFAULT),
  Integer(CW_USEDEFAULT),
  Integer(CW_USEDEFAULT),
  Integer(CW_USEDEFAULT),
  0,
  0,
  hInstance, // handle to application instance
  nil); // no window-creation data
При создании окна выдаётся ошибка...что не так ?
Nowichok вне форума Ответить с цитированием
Старый 10.12.2006, 20:49   #5
Nowichok
Пользователь
 
Регистрация: 23.11.2006
Сообщений: 53
По умолчанию

Чёрт! В этом DelphiWorld ещё и примеры с ошибками даны, что приходится сидеть и часами разбираться. В итоге ошибка оказывается элементарной, но малозаметной. Так что понял, в чём глюк был.

С одним разобрались....будем разбираться дальше.
Nowichok вне форума Ответить с цитированием
Старый 12.12.2006, 17:33   #6
Nowichok
Пользователь
 
Регистрация: 23.11.2006
Сообщений: 53
По умолчанию

Так...вроде разобрался с созданием окна, теперь проблема с его уничтожением.

Есть глобальные переменные :
Код:
 hwndMain: THandle;
 HDC:HWND; 
 wc : TWndClassEx;
Я создаю окно ВНУТРИ библиотеки...при инициализации
Код:
 begin
  DLLProc:= @DLLEntryPoint;
  DLLEntryPoint(DLL_PROCESS_ATTACH);
end.
Код:
 procedure DLLEntryPoint(dwReason: DWord); stdcall;
begin
  case dwReason of
    DLL_PROCESS_ATTACH: CreateWin;
    DLL_PROCESS_DETACH:
     begin
      ReleaseDC(hwndMain,HDC);
      CloseHandle(hwndMain);
      UnRegisterClass(wc.lpszClassName,HInstance);
     end;
  end;
end;
Собственно, сама CreateWin
Код:
 procedure CreateWin;
begin
 wc.cbSize:=sizeof(wc);
 wc.style:=cs_hredraw or cs_vredraw;
 wc.lpfnWndProc:=@MyProc;
 wc.cbClsExtra:=0;
 wc.cbWndExtra:=0;
 wc.hInstance:=HInstance;
 wc.hIcon:=LoadIcon(0,idi_application);
 wc.hCursor:=LoadCursor(0,idc_arrow);
 wc.hbrBackground:=2; // 0..25 
 wc.lpszMenuName:=nil;
 wc.lpszClassName:='My';

 if RegisterClassEx (wc) = 0 then
   MessageBox (0, 'Invalid class registration','Plain API', MB_OK);

  hwndMain := CreateWindowEx(
  WS_EX_TOPMOST,
  'My',
  '',
  WS_POPUP,
  480,
  0,
  120,
  30,
  0,//нет родительского окна
  0,//нет меню
  hInstance, // handle to application instance
  nil); // no window-creation data

   HDC:=GetDC(hWndMain);     //получаю контекст устройства.
 //   ShowWindow(hwndMain, SW_SHOW);

end;
Моё созданное окно не умеет обрабатывать сообщения, т.к. у меня в библиотеке ещё есть клавиатурный хук...и ,след-но, до него сообщения просто не доходят (или я не знаю, как это сделать).

При выходе из программы выдаётся ошибка, связанная с памятью....Предполагаю, что неправильно освобождаю ресурсы, отведённые для класса/окна.

Наверное, что-то неправильно написал ? ...Просто с нуля всё это понимал, мало в этом разбираюсь.
Nowichok вне форума Ответить с цитированием
Старый 12.12.2006, 20:06   #7
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

DestroyWindow(HANDLE);
rpy3uH вне форума Ответить с цитированием
Старый 13.12.2006, 15:06   #8
Nowichok
Пользователь
 
Регистрация: 23.11.2006
Сообщений: 53
По умолчанию

Ну как всегда - ошибка в том моменте, который я меньше всего понимаю...сделал через DestroyWindow(HANDLE);
Сначала всё равно были ошибки....потом посоветовали убрать StdCall в
Код:
procedure DLLEntryPoint(dwReason: DWord); stdcall;
begin
  case dwReason of
    DLL_PROCESS_ATTACH:
     begin
      CreateWin;
     end;
    DLL_PROCESS_DETACH:
..............
О радость ! Заработало !! Может кто-нибудь объяснить, что это изменило ?? Ибо описание директивы StdCall :

Параметры помещаются в стек слева направо. Очистка стека осуществляется вызываемой процедурой. Этот вызов обеспечивает обработку фиксированного числа параметров


мне ни очём не говорит..не понимаю я эти моменты

Последний раз редактировалось Nowichok; 13.12.2006 в 15:08.
Nowichok вне форума Ответить с цитированием
Старый 13.12.2006, 20:09   #9
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

просто в дельфи по умолчанию стоит паскалевский способ вызова
rpy3uH вне форума Ответить с цитированием
Старый 13.12.2006, 21:05   #10
Nowichok
Пользователь
 
Регистрация: 23.11.2006
Сообщений: 53
По умолчанию

Ох..да что-ж это такое. Коли не во время работы глючит, так в конце.
Замечен такой момент....код в библиотеке :
Код:
 DLL_PROCESS_DETACH:
     begin
      ShowMessage('do vihoda!');
      ReleaseDC(hwndMain,HDC);
      ShowMessage('Posle Release!');
      DestroyWindow(hwndMain);
      ShowMessage('Posle Destroy Window!');
     UnRegisterClass(wc.lpszClassName,HInstance);  //а что с этим..что без этого - глючит
      ShowMessage('Posle Vsego!');
     end;
Запускаем программу из среды Delphi (компилируем в общем)...отмечу, что если тут же закрыть программУ, то всё ок. Но суть не в этом. Я нажимаю на кнопи (происходит обработка в самом хуке). После этого я закрываю программу. Ест-но появляется 2 окна...одно от Delphi32, другое от моей программы. В обоих по надписи
ShowMessage('do vihoda!');

Если я нажимаю всё в окне Delphi32, то после
ShowMessage('Posle Vsego!');
выводится ошибка (или даже не выводится) и Delphi просто закрывается и после закрытия точно ошибка вылазит, связанная с памятью. Если же нажимать сначала всё в окне моей программы (т.е. дать ей первой выгрузиться), то всё ок, Delphi спокойно выгружает из себя библиотеку.

Для чего всё это ?? Дело в том, что если пустить ан компиляцию без этих проверок, то при закрытии выдаётся ошибка Delphi (т.е. Delphi пытается выгрузить библиотеку раньше, чем это делает сама программа...в итоге ошибка).

НО..если я пускаю .EXE файл программы, то всё работает на ура. При выходе ни один проесс не даёт ошибки. Только вот при выключении компа Explorer выдаёт ту же ошибку, что и Delphi (опять же видать пытается сделать работу до того, как сама программа выполнит операции по своему закрытию).

Грешу на неправильность операциф при выходе из программы.
Nowichok вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание новых таблиц в Access через Delphi mopozoff БД в Delphi 25 05.12.2009 20:18
Создание кнопки зная HWND окна(рабочий стол) WOLFak Компоненты Delphi 1 07.04.2008 07:45
Создание окна при получение определенного пакета GHOST_Kasper Общие вопросы Delphi 5 06.02.2008 13:01
Создание обьектов файловой системы через делфи BETONOMESHALKA Общие вопросы Delphi 2 26.12.2007 22:17
создание cgi для сохранения на сервере exe файла преданного через http L0rD Работа с сетью в Delphi 2 22.06.2007 12:52