![]() |
MinValue einer fremden SpinEdit ändern
Hallo :hi:
Kann mir jmd. sagen, wie man die MinValue Eigenschaft einer fremden SpinEdit (also eine SpinEdit in einem anderen Delphi Programm) ändern kann? (Handle der SpinEdit ist vorhanden) Den Text mit SendMessage und WM_SETTEXT zu ändern ist kein Problem, aber kann man auch eine Eigenschaft ändern? Danke! |
Re: MinValue einer fremden SpinEdit ändern
Das spinEdit ist nicht so ausgelegt, dass man MinValue ändern kann.
|
Re: MinValue einer fremden SpinEdit ändern
scahde, kann man denn sonst irgendwie verhindern, das der gesetzt Text, der per WM_SetText gesetzt wird aufgrund der MinValue Eigenschaft sofort zurückgesetzt wird?
|
Re: MinValue einer fremden SpinEdit ändern
Kommt auf die Notwendigkeit an?
Du kannst über die WndProc die Instanz finden und das Programm darüber "ändern". Ich kanns dir vielleicht in einer halben Stunde hinbiegen. Aber jetzt muss ich erstmal los. Ist das wirklich notwendig? |
Re: MinValue einer fremden SpinEdit ändern
Also für mich ist es eig. schon ziemlich wichtig, wäre echt super, wenn du eine Lösung findest.
Ich hätte gedacht es ginge einfach per Sendmessage oder so... :roll: Es wäre auch schon gut, wenn man die MinValue Eigenschaft irgendwie deaktivieren könnte oder einfach nur dessen Funktionalität irgendwie ausschalten könnte. Danke |
Re: MinValue einer fremden SpinEdit ändern
Ui, das war doch etwas umständlicher als ich dachte.
Delphi-Quellcode:
Keine Garantie, dass das funktioniert!
uses typinfo;
function getwindowLongEx(hProcess:THandle;wnd:hwnd):cardinal; const Procsize=200; type PPThread=^TPThread; TPThread=packed record Proc:array[0..Procsize-1] of char; wndproc:cardinal; wnd:hwnd; getWindowLong:function(wnd:hwnd;param:integer):cardinal;stdcall; end; function RemoteThread(param:PPThread):integer;stdcall; begin param^.wndproc:=param^.getWindowLong(param^.wnd,gwl_wndproc); result:=0; end; procedure dispRT; asm nop end; var lib:hmodule; PThread:TPThread; mThread:PPThread; source:pointer; ThreadID,temp:cardinal; hThread:THandle; begin source:=@RemoteThread; move(source^,PThread.Proc[0],integer(@dispRT)-integer(source)); lib:=getmodulehandle('user32.dll'); PThread.getWindowLong:=getprocaddress(lib,'GetWindowLongA'); Pthread.wnd:=wnd; PThread.wndproc:=0; mThread:=virtualallocEx(hProcess,nil,sizeof(TPThread),MEM_Commit or MEM_Reserve,Page_Execute_READWrite); writeprocessmemory(hProcess,mThread,@PThread,sizeof(TPThread),temp); hThread:=createremotethread(hProcess,nil,0,mThread,mThread,0,ThreadID); if waitforsingleobject(hThread,2000)=Wait_Object_0 then begin readprocessmemory(hProcess,mThread,@PThread,sizeof(TPThread),temp); result:=PThread.wndproc; closehandle(hThread); virtualfreeEx(hProcess,mThread,0,Mem_Release); end else result:=0; end; function changeProperty(wnd:hwnd;AClass:TClass;PropName:string;Value:Integer):boolean; type TSetProc=packed record case Boolean of TRUE:(SetProc:Pointer); FALSE:(Pos:word; Ident:Word); end; var wndproc:cardinal; obj,inst:pointer; setp:TSetProc; hProcess:Thandle; PID,temp:Cardinal; begin getwindowthreadProcessID(wnd,PID); try hProcess:=openprocess(Process_ALL_ACCESS,false,PID); if hProcess<>0 then begin try wndProc:=getwindowlongEx(hProcess,wnd); obj:=pointer(wndproc+9); setp.SetProc:=getpropinfo(AClass,PropName).SetProc; if setp.ident<>$FF00 then setp.SetProc:=getpropinfo(AClass,PropName).GetProc; if setp.ident=$FF00 then begin if readprocessmemory(hProcess,obj,@inst,4,temp) then begin inst:=pointer(cardinal(inst)+setp.Pos); result:=writeProcessMemory(hProcess,inst,@value,4,temp); end else result:=false; end else result:=false; finally closehandle(hProcess); end; end else result:=false; except result:=false; end; end; Damit kannst du in einem anderen Delphiprogramm ein published 32bit-Property eines TWincontrols (oder deren Nachfahre) ändern, wenn entweder der Getter oder der Setter keine Methoden sind (was für MinValue und MaxValue von TSpinEdit zutrifft). Anwendung (für deinen Fall):
Delphi-Quellcode:
changeProperty(wnd,TSpinEdit,'MinValue',0);
//0 ist der neue Wert |
Re: MinValue einer fremden SpinEdit ändern
:bouncing4:
vielen dank sirius, es funktioniert tatsächlich perfekt! hast mich gerettet :thumb: :dp: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:44 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz