Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

ShowWindow из-под dll

5.2K
02 декабря 2006 года
SerMax
96 / / 04.11.2006
Всем привет ! Это снова я :) .
Есть программка с глобальным хуком. Так вот хочу, чтобы при нажатии на кнопку появлялось окно (там будет указана текущая громкость звука)
Возникла такая проблема :
если я в dll-файле пишу :
 
Код:
ShowWindow(CurrentF.Handle, SW_SHOWNOACTIVATE);    
 
{SW_SHOWNOACTIVATE Отображает окно в его последней позиции и с последними размерами. Активным остается то окно, которое было активным до этого.}

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

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

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

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

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

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

структуру Message.....но вот что оттуда брать и как это использовать ??

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

библиотека :
Код:
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* ничего уже не делается.... ((
5.2K
03 декабря 2006 года
SerMax
96 / / 04.11.2006
Так...вроде что-то там попарился...будет работать, ЕСЛИ кто-нибудь поможет, как исправить такое :
 
Код:
procedure TChange_Volume.FormCreate(Sender: TObject); //Основная форма
var hkprcKeyboard: TFNHookProc;
begin
Application.CreateForm(TCurrentF, CurrentF);
...............


После этой строчки у меня Application (как бы это правильно выразиться), указывает НЕ НА ГЛАВНУЮ форму Change_Volume, а на ту ,которую я создал....
А то получается : хочу показать главную форму. Для этого есть код
Application.OnRestore

Но показывается не главная форма, а форма TCurrentF........ .
Как это исправить ?

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

P.S. Ну хоть напишите, что думаете...неужто ветка такая плохая
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог