🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: be.comp.programming
6 messages
6 total messages Started by Cofke Tue, 22 Apr 2003 13:01
Api SetWindowsText
#5507
Author: Cofke
Date: Tue, 22 Apr 2003 13:01
10 lines
1297 bytes
Met de API SetWindowsText kan ik de caption van windows en buttons 
aanpassen in andere programma's.
Bestaat er ook een API die de text in een textvak kan aanpassen.
Ik krijg de handle van een textbox wel opgevraagd door er als parameter de 
inhoud van de textbox aan mee te geven en schijnbaar aangepast ook (met 
enumchilds is de naam verandert), alleen de inhoud van de textbox zelf 
verandert niet mee.

Greetz
Cofke
Re: Api SetWindowsText
#5508
Author: KLinZ
Date: Tue, 22 Apr 2003 18:00
36 lines
2285 bytes
Cofke wrote:

> Met de API SetWindowsText kan ik de caption van windows en buttons
> aanpassen in andere programma's.
> Bestaat er ook een API die de text in een textvak kan aanpassen.
> Ik krijg de handle van een textbox wel opgevraagd door er als
> parameter de inhoud van de textbox aan mee te geven en schijnbaar
> aangepast ook (met enumchilds is de naam verandert), alleen de inhoud
> van de textbox zelf verandert niet mee.

De documentatie van SetWindowText() maakt melding van een kleine feature;

"SetWindowText cannot change the text of a control in another application."

en:

"If the target window is owned by the current process, SetWindowText causes
a WM_SETTEXT message to be sent to the specified window or control"


Om die controle te omzeilen kun je doen wat SetWindowText doet:

var
    str: PChar;
begin
    str := 'kl0nt';
    SendMessage(WindowHandleGevondenMetEnumChilds, WM_SETTEXT, Lenght(str),
longint(str));
end;


Als dit niet mocht werken is er nog wel een andere oplossing, maar die voert
technisch erg ver en is bovendien niet echt betrouwbaar (code injection).

--
www.zenobits.com
Re: Api SetWindowsText
#5509
Author: Cofke
Date: Tue, 22 Apr 2003 21:12
8 lines
1161 bytes
"KLinZ" <klinz@NOSPAMMERTSzenobits.com> wrote in
news:uqfpa.2933$KF1.86438@amstwist00: 

Ik heb het ondertussen opgelost met subclassing, maar jou methode ga ik ook    
zeker eens testen.
Bedankt
Greetz
Cofke
Re: Api SetWindowsText
#5419
Author: KLinZ
Date: Wed, 23 Apr 2003 16:25
14 lines
1663 bytes
Cofke wrote:
> "KLinZ" <klinz@NOSPAMMERTSzenobits.com> wrote in
> news:uqfpa.2933$KF1.86438@amstwist00:
>
> Ik heb het ondertussen opgelost met subclassing, maar jou methode ga
> ik ook zeker eens testen.

Subclassing ook echt! Lijkt me redelijk overkill voor wat je wilt.

Ik ben trouwens wel benieuwd hoe jij subclassing gebruikt om de window text
te zetten. Kun je wat hints geven?

--
www.zenobits.com
Re: Api SetWindowsText
#5422
Author: Cofke
Date: Wed, 23 Apr 2003 19:59
32 lines
2098 bytes

Ik had men licht nog eens opgestoken bij www.allapi.net.
Mijn test-projectje schrijft gewoon met de ene form text in de textbox van 
de andere form.(2 verschillende projecten).

Bij de zender ga je ;-opvragen de handle van het windowchild (textbox) waar 
je naar wil schrijven.
    	    	    	   -sendmessage(handle etc..) uMsg=2000

Bij de ontvanger -CallWindowProc
**********************************
Public Sub HookForm(F As Form)
PrevProc = SetWindowLong(F.hwnd, GWL_WNDPROC, AddressOf WindowProc)
End Sub

Public Sub UnHookForm(F As Form)
SetWindowLong F.hwnd, GWL_WNDPROC, PrevProc
End Sub

Public Function WindowProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal 
wParam As Long, ByVal lParam As Long) As Long
WindowProc = CallWindowProc(PrevProc, hwnd, uMsg, wParam, lParam)
If uMsg = 2000 Then
Form1.Text1 = Form1.Text1 & Str(uMsg) & vbCrLf & Str(lParam)
End If
End Function
************************************

Als wilt stuur ik de 2 projecten wel eens door.
Greetz
Cofke
Re: Api SetWindowsText
#5424
Author: KLinZ
Date: Wed, 23 Apr 2003 23:22
44 lines
3022 bytes
Cofke wrote:
> Ik had men licht nog eens opgestoken bij www.allapi.net.
> Mijn test-projectje schrijft gewoon met de ene form text in de
> textbox van de andere form.(2 verschillende projecten).
>
> Bij de zender ga je ;-opvragen de handle van het windowchild
> (textbox) waar je naar wil schrijven.
>                -sendmessage(handle etc..) uMsg=2000
>
> Bij de ontvanger -CallWindowProc
> **********************************
> Public Sub HookForm(F As Form)
> PrevProc = SetWindowLong(F.hwnd, GWL_WNDPROC, AddressOf WindowProc)
> End Sub
>
> Public Sub UnHookForm(F As Form)
> SetWindowLong F.hwnd, GWL_WNDPROC, PrevProc
> End Sub
>
> Public Function WindowProc(ByVal hwnd As Long, ByVal uMsg As Long,
> ByVal wParam As Long, ByVal lParam As Long) As Long
> WindowProc = CallWindowProc(PrevProc, hwnd, uMsg, wParam, lParam)
> If uMsg = 2000 Then
> Form1.Text1 = Form1.Text1 & Str(uMsg) & vbCrLf & Str(lParam)
> End If
> End Function
> ************************************
>
> Als wilt stuur ik de 2 projecten wel eens door.

Nee, dat hoeft niet. Ik ben wel met subclassing e.d. bekend. Ik vroeg me
alleen af waarom je godsnaam subclassing zou gebruiken om zoiets op te
lossen :-)

Ik was eerst in de veronderstelling dat je geen toegang tot de broncode van
de applicatie waarvan je de caption wilde wijzigen. In dat geval zou je
namelijk wel van de SendMessage(hWnd, WM_SETTEXT, ... , ...) constructie
gebruik moeten maken. In jouw geval levert dat weinig voordeel op omdat je
toch op de 1/andere manier die handle moet doorgeven danwel op moet vragen.
En dan maakt het niet veel meer uit of dat je dat met subclassing of op een
andere manier doet.

--
www.zenobits.com
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads