Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi MinValue einer fremden SpinEdit ändern (https://www.delphipraxis.net/108017-minvalue-einer-fremden-spinedit-aendern.html)

kng 6. Feb 2008 13:52


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!

sirius 6. Feb 2008 13:56

Re: MinValue einer fremden SpinEdit ändern
 
Das spinEdit ist nicht so ausgelegt, dass man MinValue ändern kann.

kng 6. Feb 2008 14:02

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?

sirius 6. Feb 2008 14:11

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?

kng 6. Feb 2008 15:22

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

sirius 6. Feb 2008 17:41

Re: MinValue einer fremden SpinEdit ändern
 
Ui, das war doch etwas umständlicher als ich dachte.

Delphi-Quellcode:
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;
Keine Garantie, dass das funktioniert!

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

kng 6. Feb 2008 23:55

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 12:09 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz