Handle auf Fokusfenster ermitteln
-
Hi ihr,
Mit der API-Funktion GetActiveWindow(); bekommt man einen Handle auf das momentan aktive Fenster.
Ich habe nun ein Programm geschrieben, was alle 100 ms mit Hilfe eines Timers das Handle des aktuell fokusierten Fensters in eine Datei schreibt.
Sobald ich jedoch ein anderes Fenster als das meines eigenen Programmes fokusiere, wird in die Datei nicht mehr 0x23423 oder sowas, sondern nurnoch 0 geschrieben.Woran liegt das?
Ist es nicht möglich die Handles Fremder Fenster zu ermitteln?cya
David
-
Schon! Aber GetActiveWindow wie GetFocus arbeiten thread-lokal.
Hilft Dir GetForegroundWindow?Warum möchtest Du das tun?
-
MSDN schrieb:
The GetActiveWindow function retrieves the window handle to the active window attached to the calling thread's message queue.
Polling ist sowieso eine beschissHH^Heidene Methode, soetwas zu machen.
Wie wär's mit nem Hook?hook.dll
hook.hpp
#ifndef HOOK_HPP_INCLUDED #define HOOK_HPP_INCLUDED HOOK_HPP_INCLUDED #include <windows.h> #ifdef HOOK_API_BUILD # define HOOK_API __declspec( dllexport ) #else # define HOOK_API __declspec( dllimport ) #endif LRESULT HOOK_API CALLBACK hook( int code, WPARAM wparam, LPARAM lparam ); #endif /* HOOK_HPP_INCLUDED */hook.cpp
#define HOOK_API_BUILD #include "hook.hpp" LRESULT HOOK_API CALLBACK hook( int code, WPARAM wparam, LPARAM lparam ) { if( code < 0 ) { return CallNextHookEx( 0, code, wparam, lparam ); } if( code == HCBT_SETFOCUS ) { // ein Fenster bekommt den Fokus... } return 0; } int WINAPI DllMain( HINSTANCE instance, int reason, void *reserved ) { return TRUE; }Anwendung:
main.cpp
#include <windows.h> #include <tchar.h> int WINAPI WinMain( HINSTANCE instance, HINSTANCE previous_instance, char *command_line, int show_state ) { HMODULE hook_library = LoadLibrary( _T( "hook.dll" ) ); if( !hook_library ) { MessageBox( 0, _T( "hook.dll couldn't be loaded!" ), _T( "Error:" ), MB_OK | MB_ICONEXCLAMATION ); return 0; } HOOKPROC hook = reinterpret_cast< HOOKPROC >( GetProcAddress( hook_library, "?hook@@YGJHIJ@Z" ) ); if( !hook ) { MessageBox( 0, _T( "hook( ) couldn't be found in hook.dll" ), _T( "Error:" ), MB_OK | MB_ICONEXCLAMATION ); return 0; } if( !SetWindowsHookEx( WH_CBT, hook, hook_library, 0 ) ) { MessageBox( 0, _T( "Failed to register the hook!" ), _T( "Error:" ), MB_OK | MB_ICONEXCLAMATION ); return 0; } while( true ) { Sleep( 100 ); } return 0; }cheers, Swordfish
-
@swordfish:
Ich kann es nicht mehr sehen, dass hier permanent hooking für irgendetwas als Lösung angeboten wird. Polling ist in soch einem Fall wohl weitaus besser, wenn man sich die Seiteneffekte ansieht die Hooking mit sich bringt.
- Performace Verlust
- Risiko der instabilität durch schlechte Programmierund und miesen Interopund es mag noch viel mehr geben.
Was spricht dagegen in einem bestimmten Moment einfach zu ermitteln wer den Focus hat?
Es bleibt noch die Frage welchen Sinn, das überhaupt haben soll, zu protokollieren wer wann den Focus hatte. Aber wenn man es für die User Kontrolle benötigt interessiert sowieso nur, wer etwas längerals 100ms in einem Fenster bleibt...
-
Ich hab' jetzt keine Benchmarks gemacht, aber ich denke, dass ein Poll alle 100ms (!) auch auf die Performance drückt. Ohne das Warum und Wieso des OP zu kennen, ist es da wahrscheinlich schwer, eine Empfehlung zu geben. Es ist übrigens das allererste mal, dass ich in diesem Forum einen Hook als Lösung vorschlage - und es tut mir schon leid...
cheers, Swordfish
-
Also ich benutz jetzt einfach die Funktion GetForegroundWindow und bin froh damit

Denn es funktioniert.
Ich brauchte das nur, weil ich Lust hatte zur Übung ein API-Programm zu schreiben, wo alle geöffneten Fenster beim anklicken wie wild über den Bildschirm kreisen xDcya
David
-
Swordfish schrieb:
Es ist übrigens das allererste mal, dass ich in diesem Forum einen Hook als Lösung vorschlage - und es tut mir schon leid...
Es sei Dir verziehen ;)... wenn es so bleibt <duck&wech>
Ein gesegnetes Wochenende noch...