Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2008.12.14;
Скачать: [xml.tar.bz2];

Вниз

Как получить дескриптор последнего активного окна ?   Найти похожие ветки 

 
delphi_is_cool   (2008-01-30 20:34) [0]

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


 
ketmar ©   (2008-01-30 21:44) [1]

поставить system-wide хук и внимательно наблюдать.


 
han_malign ©   (2008-01-31 09:57) [2]

The GetNextWindow function retrieves a handle to the next or previous window in the Z-Order.


 
ketmar ©   (2008-01-31 10:03) [3]

>[2] han_malign©(31.01.08 09:57)
только это не обязательно именно то окно, «с которого переключились». а вдруг «то окно» вовсе спрятали, результатом чего и стало переключение, например?


 
han_malign ©   (2008-01-31 10:10) [4]

оно еще и топовым может быть...
все зависит от конкретной задачи.


 
ketmar ©   (2008-01-31 10:15) [5]

>[4] han_malign©(31.01.08 10:10)
ну да. потому я и сказал сразу универсальный способ. и жду, когда автор изволит пояснить конкретно, чего ему надо-то. %-)


 
delphi_is_cool   (2008-01-31 10:58) [6]


> ну да. потому я и сказал сразу универсальный способ. и жду,
>  когда автор изволит пояснить конкретно, чего ему надо-то.
>  %-)

Мне нужно получить handle окна, которое было активно, до активации моего приложения. Возможно ли сделать это без использования хуков ?

> ketmar ©   (30.01.08 21:44) [1]
>
> поставить system-wide хук и внимательно наблюдать.
>

Ставлю(WH_CBT), наблюдаю ... но что-то не получаеццо, мб не в ту сторону копаю. Выкладываю код:

const
 CBTHookLib = "CBTHookLib.dll";

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
 hLib := LoadLibrary(CBTHookLib);
 if hLib = 0 then
   ShowMessage(SysErrorMessage(GetLastError));
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
 if hLib <> 0 then
   FreeLibrary(hLib);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 if hHook <> 0 then
   Exit;

 hHook := SetWindowsHookEx(WH_CBT, GetProcAddress(hLib, "CBTProc"), hLib, 0);

 if hHook = 0 then
   ShowMessage(SysErrorMessage(GetLastError));
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
 if hHook = 0 then
   Exit;

 if not UnhookWindowsHookEx(hHook) then
   ShowMessage(SysErrorMessage(GetLastError));

 hHook := 0;
end;

Код длл:

const
 LogFileName = "txt.txt";

var
 hHook: Windows.HHOOK;

function CBTProc(nCode: LongInt; wParam: WPARAM; lParam: LPARAM) : LRESULT; stdcall;
var
 F: TextFile;
 Buffer1, Buffer2: array [0..2047] of Char;
begin
 if nCode = HCBT_ACTIVATE then
 begin
   ZeroMemory(@Buffer1, SizeOf(Buffer1));
   ZeroMemory(@Buffer2, SizeOf(Buffer2));
   
// PCBTActivateStruct(lParam)^.hWndActive - наскольно я понимаю тут и должен находится handle активного окна,
   // но имя класса не определяется, - почему ? :)
GetClassName(PCBTActivateStruct(lParam)^.hWndActive, Buffer1, SizeOf(Buffer1));
   // Здесь handle окна которое будет назначено активным
GetClassName(HWND(wParam), Buffer2, SizeOf(Buffer2));

   AssignFile(F, LogFileName);
   if not FileExists(LogFileName) then
     Rewrite(F) else Append(F);

   WriteLn(F, String(Buffer1) + " -> " + String(Buffer2));
   CloseFile(F);
 end;

 Result := CallNextHookEx(hHook, nCode, wParam, lParam);
end;


 
clickmaker ©   (2008-01-31 11:19) [7]

WM_ACTIVATEAPP

lParam
Specifies a thread identifier (a DWORD). If the wParam parameter is TRUE, lParam is the identifier of the thread that owns the window being deactivated. If wParam is FALSE, lParam is the identifier of the thread that owns the window being activated.

WM_SETFOCUS

wParam
Handle to the window that has lost the keyboard focus.

не подойдет?


 
clickmaker ©   (2008-01-31 11:27) [8]

как вариант, еще WM_ACTIVATE - lParam


 
ketmar ©   (2008-01-31 11:38) [9]

>Возможно ли сделать это без использования хуков ?
возможно. но очень напряжно и чревато ошибками.

>мб не в ту сторону копаю
может быть. про memory mapping, то, что hHook должна быть одной для всех процессов и ты пы, думаю, пояснять не надо?

также неплохо бы логить значения hWnd, посмотреть, что дают таки. ну, и LastError до кучи.


 
ketmar ©   (2008-01-31 11:38) [10]

вдогон: были у меня какие-то проблемы с CBT, но вот от кривых ли рук или от того, что оно «странно работает» — не помню.


 
delphi_is_cool   (2008-01-31 14:27) [11]

Похоже CBT хук действительно странно работает - PCBTActivateStruct(lParam)^.hWndActive всегда равен 0, за исключением тех ситуаций, когда переключение между окнами происходит внутри приложения установившего хук(к примеру если вызвать MessageBox или тот же ShowMessage), мб так и должно быть ...

Вариант с WM_ACTIVATEAPP посредством замены оконной ф-ции Application, я уже пробовал, работает только в тех случаях, когда переключение произошло "не специально", см. [3]


 
Игорь Шевченко ©   (2008-01-31 17:12) [12]

Запустить WinSight и посмотреть, какие сообщения приходят потоку приложения, не судьба ?



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2008.12.14;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.006 c
2-1225870843
Zhekson
2008-11-05 10:40
2008.12.14
Как поместить курсоры в файл ресурсов???


15-1223507703
Eraser
2008-10-09 03:15
2008.12.14
Об IT, госзаказах и немного об образовании


2-1226048524
Костик
2008-11-07 12:02
2008.12.14
Консольное приложение


3-1211460994
Ega23
2008-05-22 16:56
2008.12.14
Ораклисты, просвятите


6-1196112678
Costy
2007-11-27 00:31
2008.12.14
подключения через WI FI посредством стандартных компонентов





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский