ShowWindow(CurrentF.Handle, SW_SHOWNOACTIVATE);
{SW_SHOWNOACTIVATE Отображает окно в его последней позиции и с последними размерами. Активным остается то окно, которое было активным до этого.}
ShowWindow из-под dll
Есть программка с глобальным хуком. Так вот хочу, чтобы при нажатии на кнопку появлялось окно (там будет указана текущая громкость звука)
Возникла такая проблема :
если я в dll-файле пишу :
Код:
То окно не появляется...мало того, не выполняется ни один оператор, который находится после этой строчки.
Если же это написать в ГЛАВНОЙ форме (при нажатии на клавишу ,допустим)..., то всё работает.
Есть опасениЯ, что глючит из-за параметра 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;
............ //а до сюда уже не доходит :)
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;
..........
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* ничего уже не делается.... ((
Код:
procedure TChange_Volume.FormCreate(Sender: TObject); //Основная форма
var hkprcKeyboard: TFNHookProc;
begin
Application.CreateForm(TCurrentF, CurrentF);
...............
var hkprcKeyboard: TFNHookProc;
begin
Application.CreateForm(TCurrentF, CurrentF);
...............
После этой строчки у меня Application (как бы это правильно выразиться), указывает НЕ НА ГЛАВНУЮ форму Change_Volume, а на ту ,которую я создал....
А то получается : хочу показать главную форму. Для этого есть код
Application.OnRestore
Но показывается не главная форма, а форма TCurrentF........ .
Как это исправить ?
Мне специально нужно создать эту форму внутри обработчика создания основной формы....
P.S. Ну хоть напишите, что думаете...неужто ветка такая плохая