Hej. Här finns i alla fall en exempelapp som tar fram hWnd på den kontroll du håller musen över. Det finns en GetFocus metod i win apiet.. Men den pekaren som returneras är alltid noll :/ Jag håller på att skriva en artikel om detta och du och andra får gärna beta-testa koden innan jag publicerar den. Titta, jag får ju tillbaka handlet... GetWindowLong returnerar en int Nu funkar det för winforms... Jag använde hwden på det aktuellta föntret för att hämta IHtmlDocumentet. Men detta funkar bra för IE Mm, kontrollerna på en webbsida har ju inget hWnd. Nej de har ju inte det.. Därför har jag löst det så att om jag inte kan avgöra ES_Password för aktiv kontroll så hämtar jag fönstret som är i fokus.. Är det ett IE fönster så hämtar jag IHtmlDocument objektet och hämtar html-element som är i fokus och kollar om type="password"Windows apifråga
Finns det nått sätt att få ut handlet till textboxen eller kontrollren som är fokus?
Måste avgöra om den textboxen som är i focus är en password box...
Skriver en liten tool för att hantera lösenord...Sv:Windows apifråga
http://www.codeproject.com/KB/dotnet/PassInfoKeep.aspxSv: Windows apifråga
Nån som fått den att funka?
http://pinvoke.net/default.aspx/user32/GetFocus.htmlSv:Windows apifråga
Saken är den att GetFocus bara returnerar den fokuserade kontrollen i den aktiva tråden. Eftersom din applikation körs i en annan tråd kommer det inte att fungera.
Jag har skrivit ihop kod som visar hur du tillfälligt kan koppla in din tråds message queue till den andras med hjälp av AttachThreadInput.
[DllImport("user32.dll")]
static extern IntPtr GetForegroundWindow();
[DllImport("user32.dll")]
static extern IntPtr GetWindowThreadProcessId(IntPtr hWnd, IntPtr ProcessId);
[DllImport("user32.dll")]
static extern IntPtr AttachThreadInput(IntPtr idAttach, IntPtr idAttachTo, bool fAttach);
[DllImport("user32.dll")]
static extern IntPtr GetFocus();
public FormMain()
{
InitializeComponent();
}
private void timerUpdate_Tick(object sender, EventArgs e)
{
labelHandle.Text = "hWnd: " + FocusedControlInActiveWindow().ToString();
}
private IntPtr FocusedControlInActiveWindow()
{
IntPtr activeWindowHandle = GetForegroundWindow();
IntPtr activeWindowThread = GetWindowThreadProcessId(activeWindowHandle, IntPtr.Zero);
IntPtr thisWindowThread = GetWindowThreadProcessId(this.Handle, IntPtr.Zero);
AttachThreadInput(activeWindowThread, thisWindowThread, true);
IntPtr focusedControlHandle = GetFocus();
AttachThreadInput(activeWindowThread, thisWindowThread, false);
return focusedControlHandle;
}
Lägg till en timer med Interval 100 och koppla dess Tick-event. Se till att Enabled är True.
Lägg till en label.
Sätt Form.TopMost till True.
Sv: Windows apifråga
Tack!
Nu undrar jag en ny grej, trodde detta skulle vara det enkla..
Jag måste kolla om handlet hör till en textbox (inte en .net textbox utan en winapi textbox) och sedan kolla om det är av passwordtype...
tittade lite på pinvoke.net men hittar inge bra...Sv:Windows apifråga
http://pinvoke.net/default.aspx/user32/GetWindowLong.html
Här listar de lite olika window styles constants bland annat _ES_PASSWORD
http://www.libertybasicuniversity.com/lb4help/STYLEBITS.htm
Men de säger inte dess värde :/
Nån som vet vad jag ska OR:a med för att få ut om fönstret/kontrollen har _ES_PASSWORD satt?Sv: Windows apifråga
värdet var 0x20
Dock funkar det ej från explorer eller firefox.. Det blir false.. Koden ser ut såhär...
IntPtr ptr = FocusedControlInActiveWindow();
int result = GetWindowLong(ptr, GWL_STYLE);
System.Diagnostics.Debug.WriteLine((result & ES_PASSWORD) == ES_PASSWORD);
System.Diagnostics.Debug.WriteLine(result);
Konstanterna
private const int GWL_STYLE = -16;
private int ES_PASSWORD = 0x0020;Sv:Windows apifråga
Hur gör man för Firefox?Sv: Windows apifråga
En annan sak, i äldre Windows-versioner vet jag att det gick att läsa ut lösenordet på liknande sätt från en password-textbox. Men det går väl inte i nyare versioner, XP & Vista?Sv:Windows apifråga
Jag skulle vilja göra nått liknande för FF..