DDE Abfrage



Frank Abbing, 25.11.2007 17:05: Mit der Dll-Liste ist nichts anzufangen.
Starte mal meinen kleinen Code und gehe mit dem Mauszeiger über den String in deinem Programm. Wird der Text in meinem Fenster bei "Fenstertext" angezeigt? Wenn ja ist das schon die halbe Miete...

'
' (W) 2003 Frank Abbing
'
Declare sx&,sy&,bereich#,be#,erg&,erg2&,x&,y&,text$
Dim be#,8
Dim bereich#,1024
DEF GetCursorPos(1) !"USER32","GetCursorPos"
DEF WindowFromPoint(2) !"USER32","WindowFromPoint"
DEF ChildWindowFromPoint(3) !"USER32","ChildWindowFromPoint"
Def GetSysColor(1) !"USER32","GetSysColor"
Def ScreenToClient(2) !"USER32","ScreenToClient"
Def GetClassName(3) !"USER32","GetClassNameA"
Def GetWindowText(3) !"USER32","GetWindowTextA"
DEF NewWindowPos(7) !"USER32","SetWindowPos"
DEF AllocConsole(0) !"KERNEL32","AllocConsole"
Proc DText
   Parameters xx&,yy&,ttext$
   Drawtext xx&,yy&,ttext$
EndProc
Windowtitle "Fensterhandles..."
windowstyle 26
window (%maxx/2-112),(%maxy/2-80)-224,164
settruecolor 1
cls GetSysColor(15)
NewWindowPos(%hwnd,-1,0,0,0,0,$13)
Usefont "MS Sans Serif",13,0,0,0,0
SetDialogFont 1
whilenot %mousepressed=2
   Sleep 10
   GetCursorPos(be#)
   x&=Long(be#,0)
   y&=Long(be#,4)
   erg&=@WindowFromPoint(x&,y&)
   If erg&<>0
      ScreenToClient(erg&,be#)
      x&=Long(be#,0)
      y&=Long(be#,4)
      erg2&=@ChildWindowFromPoint(erg&,x&,y&)
   EndIf
   TextColor 0,GetSysColor(15)
   DText 8,8, "Maus Position X = "+Str$(x&)+"          "
   DText 8,21,"Maus Position Y = "+Str$(y&)+"          "
   DText 8,38,"Handle eigenes Fenster = $"+@Hex$(%hwnd)+"                    "
   DText 8,55,"Handle unter Mauszeiger = $"+@Hex$(erg&)+"                    "
   DText 8,68,"Handle unter Mauszeiger (Child) = $"+@Hex$(erg2&)+"                    "
   GetClassname(erg&,bereich#,128)Declare sx&,sy&,text$,x&,y&,bereich#
   text$=String$(bereich#,0)
   DText 8,85,"Klassenname = "+text$+"                                                      "
   GetWindowText(erg&,bereich#,128)
   text$=String$(bereich#,0)
   DText 8,98,"Fenstername = "+text$+"                                                      "
   @SendMessage(erg&,13,128,bereich#)
   text$=String$(bereich#,0)
   DText 8,111,"Fenstertext = "+text$+"                                                      "
wend
Dispose be#
Dispose bereich#
end


Uwe S., 25.11.2007 17:19: hallo Frank
du bist da, ist ja klasse, hast aber ganz schön lange geschlafen ...
aber eben hab ich gemerkt, da is was da *freu*
so nun muss ich erst mal lesen was Du erfunden hast...
okay, das verswuch ich mal.. und Funke dich an ...
LG, Uwe


*** Message an ALLE : Frank Abbing ist GENIAL ***

Uwe S., 25.11.2007 17:46: Hi Frank,
Du solltest den XProfan-Community-Nobel-Preis bekommen...
Also zur Auswertung :
Handle unter Mauszeiger unde Mauszeiger (Child) ist immer gleich, aber bei jedem
Start von Orbitron anders (z.B. $206DC)
Bei Klassenname erscheint bei den mich interessierenden Boxen immer "TEdit"
Bei Fenstername erscheint nie was, nix, niente, nada
... und das gei.... ist, bei Fenstertext steht genau das was ich brauche, Azimut Elevation,Frequenz ...
jetzt muss ich nur noch versuchen zu verstehen wadduda gemacht hast...
LG, Uwe


Frank Abbing, 25.11.2007 19:38: Hi.
;createQuot('')Handle unter Mauszeiger unde Mauszeiger (Child) ist immer gleich, aber bei jedem
Start von Orbitron anders (z.B. $206DC)
Ja, das ist so auch logisch.
;createQuot('')Bei Klassenname erscheint bei den mich interessierenden Boxen immer "TEdit"
Ok, kein Windows-übliches Editfeld...
;createQuot('')Bei Fenstername erscheint nie was, nix, niente, nada
Auch logisch.
;createQuot('')... und das gei.... ist, bei Fenstertext steht genau das was ich brauche, Azimut Elevation,Frequenz ...
Bingo! Somit kannst du dein Vorhaben ausführen.
;createQuot('') jetzt muss ich nur noch versuchen zu verstehen wadduda gemacht hast...
Du musst jetzt überlegen, ob dein Orbitron-Fenster immer am selbem Platz steht und immer im Vordergrund. Wenn ja, kannst feste Positionsangaben verwenden anstelle von Mauskoordinaten.
Wenn nein, musst du anders vorgehen. Du musst Orbitron.exe erkennen (über Prozesshandle oder Windowname), das betreffende Control mit dem Text lokalisieren (Fenstertext und Klassenname) und dann auslesen. Das ist die Methode, die ich verwenden würde.


Uwe S., 25.11.2007 20:08: okay, ...
die zweite Variante würde mir besser gefallen, allerdings brauch ich da noch mal Deine Hilfe
weil ich denke, dass bei verschiedenen Bildschirmauflösungen auch die Positionsdaten unterschiedlich sind und möglicherweise das Orbitron auch mal nicht im Vollbildmodus läuft...
... und immer daran denken, Du hast es hier mit einem Vorschulkind zu tun...
PS: und danke, hoffe ich habe Dir nicht den Sonntag vermasselt


Frank Abbing, 25.11.2007 21:34: ;createQuot('') ... und immer daran denken, Du hast es hier mit einem Vorschulkind zu tun...
Dafür ist das Thema eigentlich zu schwierig. Ich kann mir denken, dass du dieses Programm benötigst. Besser wäre aber, mit einfacheren Dingen zu beginnen...
Auf den Screenshots meine ich zu erkennen zu erkennen, dass sich die von dir benötigten Informationen in mehreren Controls verstecken. Ist das richtig?
Ich müsste genau wissen, welche Information(en) du ständig benötigst.


Uwe S., 25.11.2007 23:01: na ja, man wächst mit seinen Aufgaben, wenn ich immer nur das Leichte machen würde, könnt ich warscheinlich nicht mal aufrecht gehen
also, die im Bild rot besprühten Controls muss ich permanent auslesen, die ändern sich jede sekunde...
bis bald, LG, Uwe


orb.JPG


Frank Abbing, 25.11.2007 23:25: Hab mal was zusammen gebastelt, weiss aber nicht, ob das so unter Profan 7 läuft. Ggf. sind Umbauten vonnöten.
Der Code findet alle deine begehrten Controls, aber es wird deine Aufgabe sein zu entscheiden, welche Controls wo richtig sind. Wahrscheinlich ist die Reihenfolge aber immer gleich.

Declare Entry#,err&,handle&,cpid&,text$,text2$,pid&,cname#,z&,a&,x&,y&,zahl&
Struct PROCESSENTRY32=dwSize&, \
cntUsage&, \
th32ProcessID&, \
th32DefaultHeapID&, \
th32ModuleID&, \
Threads&, \
th32ParentProcessID&, \
pcPriClassBase&, \
dwFlags&, \
szExeFile$(260)
Dim Entry#,PROCESSENTRY32
Entry#.dwSize& = SizeOf(Entry#)
Def CreateToolhelp32Snapshot(2) !"Kernel32", "CreateToolhelp32Snapshot"
Def Process32First(2) !"Kernel32", "Process32First"
Def Process32Next(2) !"Kernel32", "Process32Next"
Def CloseHandle(1) !"Kernel32", "CloseHandle"
Def GetCurrentProcessID(0) !"Kernel32", "GetCurrentProcessId"
Def GetWindow(2) !"USER32","GetWindow"
Def GetClassName(3) !"USER32","GetClassNameA"
Def GetWindowThreadProcessId(2) !"USER32","GetWindowThreadProcessId"
Def GetParent(1) !"USER32","GetParent"
zahl&=1
Proc FillProcessList
   cpid&=GetCurrentProcessID()
   handle& = CreateToolhelp32Snapshot(2,0)
   If handle&
      err& = Process32First(handle&, Entry#)
      If err&
         text$=Str$(Entry#.th32ProcessID&)
         text2$=Entry#.szExeFile$
         Case Lower$(text2$)="orbitron.exe":Return Int(Val(text$))
         Repeat
            err& = Process32Next(handle&, Entry#)
            If err&
               text$=Str$(Entry#.th32ProcessID&)
               text2$=Entry#.szExeFile$
               Case Lower$(text2$)="orbitron.exe":Return Int(Val(text$))
            EndIf
         Until err& = 0
         CloseHandle(handle&)
      EndIf
   EndIf
   Return 0
EndProc
Proc EnumChildren
   Parameters parent&
   Declare result&,cn$
   Dim cname#,256
   GetClassName(parent&,cname#,64)
   cn$=String$(cname#,0)
   result&=GetWindow(parent&,5)
   While result&<>0
      GetWindowThreadProcessId(result&,addr(x&))
      If x&=pid&
         AddString Str$(zahl&)+". Controlhandle "+Str$(result&)+" "+Chr$(34)+GetText$(result&)+Chr$(34)
         Inc zahl&
         EnumChildren result&
      EndIf
      result&=GetWindow(result&,2)
   EndWhile
   Dispose cname#
EndProc
Cls
pid&=FillProcessList()
If pid&
   EnumChildren %desktop
   ListBox$("Ermittelte Orbitron-Control-Texte:", 1)
   WaitInput
Else
   MessageBox("Prozess Orbitron nicht aktiv...","Meldung:",64)
EndIf
Dispose Entry#
End


Uwe S., 26.11.2007 10:27: Hallo Frank.
vielen Dank, haste Dir noch die Halbe Nacht um die Ohren geschlagen, kann ich warscheinlich nie wieder gut machen...
ich werde das mal testen und Meldung geben, kann allerdings noch bischen dauern, muss nebenbei noch Ackern..
LG, Uwe


Frank Abbing, 26.11.2007 18:27: Ich hab nur zwei Quelltexte kombiniert und den Orbitron installiert, war ne halbe Stunde Arbeit.
Ist wirklich ein interessantes Tool, dieses Orbitron. Was genau möchtest du eigentlich zum den Satelliten funken?


Uwe S., 08.12.2007 19:32: Hallo Frank, ich war mal auf Dienstreise und damit weg vom „WINDOW“.
Gestern habe ich XProfan 10 bekommen und werde das dann heute gleich mal installieren, mal sehen ob dann Dein Tool funktioniert…
Ansonsten ist das mit den Amateurfunksatelliten so, dass man sie erstens als repeater benutzt, das heisst, man sendet z. Bsp. Auf 145 MHz Sprache oder Telegraphie Signale nach oben und der Sat schickt die gleichen wieder auf 435 MHz runter und durch die grosse Ausleuchtung (durch die Höhe des Sat) kann man dann zum Bsp. Eine Funkverbindung auf UKW mit Spanien aufbauen, ob wohl man auf UKW durch die Erdkrümmung nur so um die 300 bis 400 km weit kommt. Die andere Variante ist die, dass man direkt mit der Crew der ISS oder früher mit der MIR kommuniziert und dann bekommt man eine QSL-Karte zur Bestätigung der Funkverbindung, unterhalten tut man sich da meistens über technische Themen. Das schöne ist, dass man auch mit sehr geringen Sendeleistungen grosse Entfernungen überbrücken kann.
Natürlich senden die Sats auch Telemetriedaten, so dass man jederzeit über den Status der Elektronik an Bord informiert ist. Die Sats werden in der Regel auch durch Funkamateure entwickelt und dann mit den Raketen der Russen oder der Space Shuttle ins All befördert…
Link für mehr Infos : [...]
So, nun wird ich noch mal bischen mit XProfan 10 fummeln…
LG, Uwe


Frank Abbing, 08.12.2007 20:49: Jau! Klingt echt superinteressant...


Dies ist die Offlinevariante vom Thread [DDE Abfrage].

Valid CSS!

©2006 XProfan.Com