Форум программистов
Правила форума  |  Исходники Delphi  |  Основы Delphi  |  Блог программистов  |  Рассылка  |  Закажи футболку!  |  Конкурс программистов призы на 2000 руб


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

Ответ
 
Опции темы
Старый 02.12.2006, 17:01   #1
Nowichok
Форумчанин
 
Регистрация: 23.11.2006
Сообщений: 77
Репутация: 10
По умолчанию ShowWindow из-под dll

Есть программка с глобальным хуком. Так вот хочу, чтобы при нажатии на кнопку появлялось окно (там будет указана текущая громкость звука)
Возникла такая проблема :
если я в dll-файле пишу :
Код:

ShowWindow(CurrentF.Handle, SW_SHOWNOACTIVATE);    

{SW_SHOWNOACTIVATE Отображает окно в его последней позиции и с последними размерами. Активным остается то окно, которое было активным до этого.}

То окно не появляется...мало того, не выполняется ни один оператор, который находится после этой строчки.

Если же это написать в ГЛАВНОЙ форме (при нажатии на клавишу ,допустим)..., то всё работает.

Есть опасениЯ, что глючит из-за параметра SW_SHOWNOACTIVATE ,т.к. библиотека-то не имеет формы...

P.S. Опустил нюансы скрытия (закрытия) вызываемого окна и того, чтобы оно было поверх всех окон и т.д. ...это не должно влиять на мою проблему....

Последний раз редактировалось rpy3uH; 03.12.2006 в 16:34.
Nowichok вне форума   Ответить с цитированием
Старый 02.12.2006, 17:19   #2
mihali4
Старый брюзга
Заслуженный модератор
 
Аватар для mihali4
 
Регистрация: 22.11.2006
Адрес: Москва, Коньково
Сообщений: 8,851
Репутация: 2392
По умолчанию

А чей это хэндл - CurrentF.Handle?
Самой программы, с окошком?
Тогда этот параметр должен передаваться в DLL именно в виде входного параметра для обработчика.
А так получается, на собственном хэндле она и спотыкается...
__________________
Когда я вижу "памагити" в названии темы - я хватаюсь за пистолет...

Последний раз редактировалось mihali4; 02.12.2006 в 17:22.
mihali4 вне форума   Ответить с цитированием
Старый 02.12.2006, 17:22   #3
Nowichok
Форумчанин
 
Регистрация: 23.11.2006
Сообщений: 77
Репутация: 10
По умолчанию

Моей формы, которая подключена через USES к библиотеке....вот и пытаюсь показать эту форму !

ХОчу попытаться отправить сообщение либо формЕ, которую хочу показать, либо главной форме...и оттуда показать форму уже. Но не знаю, как пользоваться в этом случае SendMessage. Нашёл здесь

http://www.polyml.org/docs/Winref/Message.html

структуру Message.....но вот что оттуда брать и как это использовать ??
Nowichok вне форума   Ответить с цитированием
Старый 02.12.2006, 20:42   #4
mihali4
Старый брюзга
Заслуженный модератор
 
Аватар для mihali4
 
Регистрация: 22.11.2006
Адрес: Москва, Коньково
Сообщений: 8,851
Репутация: 2392
По умолчанию

Цитата:
Моей формы, которая подключена через USES к библиотеке....вот и пытаюсь показать эту форму
Так ежели она еще не создана, откуда у нее хэндл?
Цитата:
ХОчу попытаться отправить сообщение либо формЕ, которую хочу показать, либо главной форме
Откуда отправить? Есть еще что-то, кроме главной формы, дэльэльки и будущей формочки с текущей громкостью звука?
Ну что ж такое - прямо партизан какой-то - ничего не выдает про свою программу...
__________________
Когда я вижу "памагити" в названии темы - я хватаюсь за пистолет...
mihali4 вне форума   Ответить с цитированием
Старый 02.12.2006, 20:44   #5
Alar
Администратор
Администратор
 
Аватар для Alar
 
Регистрация: 28.10.2006
Сообщений: 4,293
Репутация: 859
По умолчанию

Пора уже прекрепить код или наработки показать...
Alar вне форума   Ответить с цитированием
Старый 02.12.2006, 20:58   #6
Nowichok
Форумчанин
 
Регистрация: 23.11.2006
Сообщений: 77
Репутация: 10
По умолчанию

На данный момент ытаюсь сделать в таком подобии..

библиотека :
Код:

library dll_Change;

uses
  ......
  Popup_volume in 'Popup_volume.pas' {CurrentF};  // вот она...форма

......

function Key_Hook(Code: integer; wParam: word; lParam: DWord): Longint;stdcall; export;
var KeyState:integer; //состояние клавиши
h:HWND;
s:String;
begin
If Code>=0 then
 begin
  if HiWord(GetKeyState(VK_MENU)) <> 0 then 
   begin
    if HiWord(GetKeyState(VK_CONTROL)) <> 0 then
     begin
      case wParam of //нажатая клавиша, сигнал которой отловила прога
       ....
       VK_MULTIPLY: //зажали ALT+CTRL+Num*
        begin
         KeyState:=GetKeyState(wParam); // это чтобы не было обработки ЗАжатия клавиши
         if (KeyState>=0) then b:=false;
         if (KeyState<0) and (b=false) then  //If KeyState < 0 Then "Нажата кнопка с кодом "
                              //Else = "Отпущена кнопка с кодом "
          begin
           b:=true;
           VolumeOnOff; // эт короче, чтобы выполнялось только ОДИН раз, если кнопка зажата
           s:=IntToStr(Temp); //текущая громкость
           SendMessage(CurrentF.Handle, MY_MESSAGE, 0, DWORD(PChar(s)));
          end;
        end;
      ............ //а до сюда уже не доходит :)

в форме CurrentF:
Код:

 ......

 const
   MY_MESSAGE = WM_USER + 4242;

 type
  TCurrentF = class(TForm)
  ......
     procedure MessageReceiver(var msg: TMessage); message MY_MESSAGE;
  
   private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  CurrentF: TCurrentF;

implementation

procedure TCurrentF.MessageReceiver(var msg: TMessage);
 var
   txt: PChar;
 begin
   txt := PChar(msg.lParam);
   showMessage('Vnutri'); //контроль, дошли ли вообще до сюда
   msg.Result := 1;
   ShowWindow(CurrentF.Handle, SW_SHOWNOACTIVATE);
 end;

..........

Ну вроде бы основное написал....глюк в строке

SendMessage(CurrentF.Handle, MY_MESSAGE, 0, DWORD(PChar(s)));

ВсЁ, что послне неё - не обрабатывается уже.......в итоге можно сказать, что программа зависает. После одного нажатия Alt+Ctrl+Num* ничего уже не делается.... ((
Nowichok вне форума   Ответить с цитированием
Старый 02.12.2006, 21:10   #7
mihali4
Старый брюзга
Заслуженный модератор
 
Аватар для mihali4
 
Регистрация: 22.11.2006
Адрес: Москва, Коньково
Сообщений: 8,851
Репутация: 2392
По умолчанию

Класс!
Такого я еще не видел - создается форма CurrentF, и внутри себя самой она же сама себя объявляет своей "унутренней" переменной!
Можно узнать, для чего сей изыск?
__________________
Когда я вижу "памагити" в названии темы - я хватаюсь за пистолет...
mihali4 вне форума   Ответить с цитированием
Старый 02.12.2006, 21:26   #8
Vilux
Новичок
 
Регистрация: 02.12.2006
Сообщений: 1
Репутация: 10
По умолчанию

Цитата:
Сообщение от mihali4 Посмотреть сообщение
Класс!
Такого я еще не видел - создается форма CurrentF, и внутри себя самой она же сама себя объявляет своей "унутренней" переменной!
Можно узнать, для чего сей изыск?
Не совсем понял юмор. А что тут не так?
Вот пример стандартного шаблона формы Дельфи

type
TForm1 = class(TForm)
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
Vilux вне форума   Ответить с цитированием
Старый 02.12.2006, 21:40   #9
mihali4
Старый брюзга
Заслуженный модератор
 
Аватар для mihali4
 
Регистрация: 22.11.2006
Адрес: Москва, Коньково
Сообщений: 8,851
Репутация: 2392
По умолчанию

Биг пардон! Это я, видимо, переутомился к вечеру...
Так что не удивляйтесь! Сейчас приму кофейку и снова в бой...
__________________
Когда я вижу "памагити" в названии темы - я хватаюсь за пистолет...
mihali4 вне форума   Ответить с цитированием
Старый 02.12.2006, 22:32   #10
mihali4
Старый брюзга
Заслуженный модератор
 
Аватар для mihali4
 
Регистрация: 22.11.2006
Адрес: Москва, Коньково
Сообщений: 8,851
Репутация: 2392
По умолчанию

Цитата:
s:=IntToStr(Temp); //текущая громкость
SendMessage(CurrentF.Handle, MY_MESSAGE, 0, DWORD(PChar(s)));
end;
end;
............ //а до сюда уже не доходит
Вот в этом куске вставляем:
s:=IntToStr(Temp); //текущая громкость

h:=Handle;

//Здесь ставим точку останова
SendMessage(CurrentF.Handle, MY_MESSAGE, 0, DWORD(PChar(s)));
end;
end;
............ //а до сюда уже не доходит
Останавливаемся и смотрим:
h имеет значение хэндла DLL
CurrentF.Handle неопределено, т.к. взять его неоткуда...

Т.е. то, о чем я уже написал выше...
__________________
Когда я вижу "памагити" в названии темы - я хватаюсь за пистолет...
mihali4 вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


Все интернет-магазины Москвы на Викимарте: компьютеры и софт, художественные книги и профессиональная литература, наручные часы.



03:56.


Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2010, Jelsoft Enterprises Ltd.

Ask Doctor at Healpth.com