Forum: PC-Programmierung Visual Assist Funktionalität nachprogrammieren


von A. B. (funky)


Lesenswert?

Hallo,

der ein oder andere kennt evtl. das Tool Visual Assisst X für die Visual 
Studio Entwicklungsumgebungen.

Es handelt sich dabei um ein Tool, welches Code-Vervollständigung, 
Korrektur usw in die IDE integriert.
Bei den neuen IDEs ist das evtl. nicht mehr ganz so wichtig, aber bei 
den alten IDEs wie MS Visual C++ 6 war das Gold wert!!

http://www.wholetomato.com/


Meine Frage ist, ob jemand einschätzen kann, wie aufwändig soetwas nach 
zu programmieren ist. Ich habe gesehen das z.b. Visual C++6 eine PlugIn 
Schnittstelle anbietet, die wohl auch benutzt wird. Ist soetwas nur zu 
erreichen, wenn das "Wirt"programm dafür vorbereitet ist, oder kann man 
soetwas für jedes andere Programm implementieren(mit vertretbarem 
Aufwand)?

Vielleicht kann das ja jemadn einschätzen? Ich kann programmieren, bin 
aber in Windowsprogrammierung nicht so fit. Aber evtl. sind die 
Grundfunktionen ja gar nicht so aufwändig?

Ich würde gerne eine IDE etwas in der Hinsicht erweiteren um z.b. 
Variablen zu vervollständigen usw. Um die Funktionalität ansich mach ich 
mir nicht so die Sorgen, aber ich kann schlecht einschätzen wie 
aufwändig die Interaktion meines Programms mit dem anderen wäre und wo 
man da ansetzt.
Es geht im Endeffekt darum, den Text an der Cursorposition zu 
analysieren, und dann irgendwas zu tun,
Dieses Visual Assist X bindet sogar ganz neue Menus in die Visual IDE 
ein usw. aber so aufwändig will ich es ja gar nicht haben

von Gast (Gast)


Lesenswert?

Ohne passende Schnittsstelle geht das eher schlecht.

von A. B. (funky)


Lesenswert?

äh...das ist nicht die Antwort die ich mir erhofft hatte ;P

Generell oder die Geschichte mit den Menüs einbinden?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Generell. Das Menü ist zweitrangig, Du wirst alleine schon Probleme 
damit haben, an den dargestellten Text zu gelangen.

Schreib mal als Übung einen Texteditor. In reinem C mit der Win32-API. 
Kein C++, keine Klassenbibliothek (keine MFC, kein Qt, kein wxWidgets 
etc.).

Wenn der funktioniert, und ein bisschen mehr kann als das reine 
Edit-Control, dann hast Du begonnen, zu begreifen, wie Windows 
funktioniert.

Und dann wirst Du verstehen, wie komplex Dein Unterfangen ist.

von zwieblum (Gast)


Lesenswert?

generell

von A. B. (funky)


Lesenswert?

ok, und somit starb die Hoffnung soeben :(

von A. B. (funky)


Lesenswert?

hmmm...ich hab die Sache noch nicht ganz abgeschrieben...habe noch paar 
Infos gefunden und man kann sich an die Tastatureingabe "anhooken"

Also prinzipiell ist das ganze denke ich machbar, nur will ich meine 
bescheidenen Windows C++ Kenntnisse da auch nicht zu hoch einschätzen 
und daran wirds dann wohl im Endeffekt scheitern.

na ma sehen

von Tobi H. (tobi-) Benutzerseite


Lesenswert?

Was bringen dir Tastatureingaben? Wenn dann musst du auch Mauseingaben, 
Datei öffnen, wechseln, Pasten, ... abfangen um sagen zu können, was 
sich gerade am Cursor befindet und damit vervollständigen läßt.

von A. B. (funky)


Lesenswert?

also ein paar Stichworte lauten:

subclassing, message hook

Damit ist genau das möglich was ich möchte, da man sich damit in die 
Message Struktur der Programme einklinken kann und somit Mouse-Events, 
Keyboard-Events usw abfangen und manipulieren kann.

Ob ich das ganze hinbekomme ist die andere Frage, da mein Windows C++ 
Wissen bisher nicht über Standardkram hinausgeht.

Desweiteren ist mir schon klar, das ich es alleine wohl kaum hinbekommen 
werde, ein zweites Visual Assisst hinzuzaubern(gerade bei meinem 
Kenntnissstand)

Aber eine simple Variablenvervollständigung, bei der das aktuelle 
Projekt durchsucht und dann entsprechend auf die Tastatureingaben 
reagiert wird halte ich mittlerweile schon für in endlicher Zeit 
machbar.

Jemand hat sogar ein komplettes Buch über den Kram geschrieben: 
http://books.google.ch/books?id=Vt-8LH-d1R8C&pg=PA103&lpg=PA103&dq=subclassing+mouse+events&source=bl&ots=RjhKQhWXnQ&sig=-UC8Vta4DyG8P-3qoe5CcIMSKlo&hl=de&ei=uA8WS4L9KNig_Aaox7SCBw&sa=X&oi=book_result&ct=result&resnum=7&ved=0CCIQ6AEwBjgK#v=onepage&q=subclassing%20mouse%20events&f=false

Subclassing & Hooking mit Visual Basic :D

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

> Aber eine simple Variablenvervollständigung, bei der das aktuelle
> Projekt durchsucht und dann entsprechend auf die Tastatureingaben
> reagiert wird halte ich mittlerweile schon für in endlicher Zeit
> machbar.

Das setzt voraus, daß Dein Programm, das --wenn ich Dich richtig 
verstanden habe-- an irgendeiner IDE andocken soll, herausfinden kann, 
was das aktuelle Projekt überhaupt ist, welche Dateien dazugehören und 
wie deren Inhalt aussieht, auch wenn der Editor Änderungen noch nicht 
gespeichert hat.

von Karl H. (kbuchegg)


Lesenswert?

A. B. schrieb:

> subclassing, message hook

Ja, so fangen alle an :-)

> Damit ist genau das möglich was ich möchte, da man sich damit in die
> Message Struktur der Programme einklinken kann und somit Mouse-Events,
> Keyboard-Events usw abfangen und manipulieren kann.

Super.
Und was hilft dir das?

Nur zur Vervollständigung:
Was du in dem Fall machen müsstest ist den kompletten Editor 
nachprogrammieren um zu wissen welchen Text der Editor eigentlich gerade 
anzeigt. Alles was du hast sind die Auslösemechanismen, mit denen der 
Editor irgendetwas macht. Du musst dieselben Änderungen in deinem 
privaten Textbuffer machen um zu wissen welchen Text der Editor gerade 
vor sich hat.

> Aber eine simple Variablenvervollständigung, bei der das aktuelle
> Projekt durchsucht

wie durchsuchst du denn?
Wo nimmst du den Text her, den der Editor jetzt gerade anzeigt? Dein 
Benutzer hat 2 Zeilen über dem Cursor eine Variable eingefügt, der Text 
ist noch nicht gespeichert worden. Wie findet deine Erweiterung dieses 
heraus? Der Programmtext existiert bislang nur im Speicher des 
originalen Editors und wurde noch nicht gespeichert.

Heck. Woher weiß deine Erweiterung eigentlich, dass es sich dabei um 
eine Variablendefinition handelt? Du musst neben dem Originaltext auch 
noch einen Syntaxanalysator bauen, der im Quelltext die Variablen 
findet! Das scheint dir gar nicht bewusst zu sein. Hast du schon einmal 
einen Compiler gebaut?

> Subclassing & Hooking mit Visual Basic :D

Hooking ist eine Sache.
Aber das ist wie: Ich beobachte welche Leute in ein Haus hineingehen und 
wieder herauskommen, welche Lichter angehen und welche nicht. Und dann 
soll ich eine Aussage darüber treffen, was diese Leute im Gebäude 
gemacht haben. Ja sogar bei dir noch weitergehend: Du willst den Leuten 
dann auch noch Vorschläge machen, wie sie ihre Arbeitsabläufe (die du 
nur durch Beobachtung der Eingangstür erraten musst) verbessern können 
:-)

(Ohne intime Kentnisse der Internals der IDE und welche Schnittstellen 
die IDE für solche AddOns bereit stellt, wird das nichts. Keyboard und 
Mouse zu hooken ist viel zu wenig)

von A. B. (funky)


Lesenswert?

Also das ganze soll natürlich nicht an IRGENDEINE IDE andocken...die IDE 
steht fest und es soll auch nur mit dieser funktionieren.

Die zum Projekt dazugehörenden Dateien kann ich simpel über die 
Projektdatei herausfinden, da dort solche Informationen abgespeichert 
sind.

Ich gebe zu, das mit den noch nicht gespeicherten Texten habe ich bisher 
nicht berücksichtigt und das ist ein großes Problem. Zur Not wird halt 
jedes eingegebene Zeichen erstmal in einen Buffer gepackt. Die paar kB 
Sourcen werden ja nun nicht das Problem sein.

Den aktuellen Projektpfad automatisch zu ermitteln könnte ein Problem 
werden. Aber evtl muss man das dann manuell konfigurieren...Zu Beginn 
sicherlich eines der unwichtigeren Probleme, welches sich leicht durch 
Komfortverzicht lösen lassen sollte.

Und jetzt übertreib mal nicht?! Ich muss doch keinen kompletten Compiler 
nachbauen?! Wo ist das Problem, alle Sourcedateien nach Definitionen wie 
int, char etc zu durchsuchen, den Rest der Zeile auszulesen und das als 
Variablen anzunehmen welche mit mindestens 3 Zeichen der aktuellen 
Eingabe seit dem letzten Leerzeichen verglichen werden?

Wie komfortabel das ganze dann ist und ob die gemachten Vorschläge 
perfekt sind steht ja noch auf einem ganz anderen Blatt.

Das ich kein zweites Visual Assisst hinzaubern werde ist mir dabei schon 
klar und auch nicht das Ziel.

von A. B. (funky)


Angehängte Dateien:

Lesenswert?

Und siehe da, auch text aus einem fremden Editro Fenster auslesen ist 
machbar.

Die Bedienung von dem Tool ist nicht gerde selbsterklärend, aber 
zumindest geht das theoretisch.

Ob ichs praktisch hinbekomme ist die andere Frage ^^

von Karl H. (kbuchegg)


Lesenswert?

A. B. schrieb:
> Und siehe da, auch text aus einem fremden Editro Fenster auslesen ist
> machbar.

LOL
Na dann mach mal.
Bin schon neugierig wie du es hinkriegst, am Desktop das Fenster zu 
finden, in dem der Benutzer gerade eingibt.


Warum fragst du eigentlich?
Du bist der Meinung es geht.
Von Rufus weiß ich, dass er lange Jahre Windows programmiert hat. Von 
mir weiß ich, dass ich seit 1992 auf Windows programmiere. Und wir alle 
sagen dass das was du vorhast alles andere als simpel ist. Wir würden 
sogar sagen: Es geht nicht. Nicht wenn alles was man hat, ein Hook ist.

Aber mach ruhig.

> Und jetzt übertreib mal nicht?! Ich muss doch keinen kompletten
> Compiler nachbauen?!

Nein musst du nicht.
OK. Ich vereinfache. Hast du schon einmal den Syntaxparser eines 
Compilers geschrieben?

> Wo ist das Problem, alle Sourcedateien nach
> Definitionen wie int, char etc zu durchsuchen, den Rest der Zeile
> auszulesen und das als Variablen anzunehmen welche mit mindestens
> 3 Zeichen der aktuellen

Aha
1
typedef unsigned char byte;
2
byte  i, j, k;

findet deine Simpelstrategie jetzt immer noch die Variablen :-)

(Soll ich noch mehr reale Beispiele konstruieren um dich davon zu 
überzeugen, dass du ohne Compilerbautechniken nicht weit kommen wirst? 
Kein Problem, ich brauch das nur noch mit ein paar #define, #include, 
struct, union würzen (*) und deine Erkennung steht aber sowas von im 
Wald. Gleichzeitig kann ich auch jede Menge Beispiele konsturieren, in 
denen deine Simpelstrategie Variablen erkennt, wo keine sind.)

Aber mach mal.

(*) da sind jetzt die Möglichkeiten, die durch kreativen Einsatz der 
Stringize und Token-Pasting Operatoren im Präprozessor möglich sind, 
noch gar nicht mitberücksichtig.

von A. B. (funky)


Lesenswert?

Lieber Karl-Heinz...das ist ja nun nicht der erste Thread in dem mich 
deine arrogante und polemisierende Art ankotzt aber hier isses nun 
wieder mal so weit tataaaaa

Hast Du Dir das TextPicker Programm überhaupt angeschaut? ne, sicherlich 
nicht...damit ist nämlich genau das möglich, einen vom Editor noch nicht 
gespeicherten Text aus dem Editor Fenster auszulesen...sprich die 
MÖGLICHKEITEN gibt es also durchaus.

Desweiteren sag ich nun ja zum x-ten mal das ich durchaus aktzeptieren 
kann, das es meine Programmierfähigkeiten übersteigt und ich auch nicht 
die eierlegende Wollmilchsau programmieren will.

Stattdessen fängst Du an wunderhübsche Beispiele zu konstruieren ohne zu 
bedenken das ich überhaupt nicht den Anspruch habe, alle Feinheiten der 
Sprache C nachzubilden und mit einfachen Variablen & Definitioen erstmal 
mehr als zufrieden wäre, was meiner Meinung nach bisher auch 
durchgeklungen sein sollte. Aber geifer ruhig weiter rum.

Alles was ich wissen wollte war nur, ob ich die Möglichkeit habe, mit 
einer fremden Anwendung die Daten einer anderen Anwendung auszulesen 
oder ob Windows das unterbindet und ob es dazu eine Plug-In 
Schnittstelle benötigt oder nicht.

Und ja, es ist möglich. Ob ich es hinbekomme weiß ich nicht und das es 
nicht trivial sein würde war mir immer klar.

von A. B. (funky)


Lesenswert?

ok, dein hinzugekommenes (*) aus deinem letzten Posting zeigt mir, das 
ich mich nicht deutlich genug ausgedrückt habe was ich möchte oder Du 
mich nicht verstehen willst oder Du ernsthafte Probleme bei der 
zwischenmenschlichen Kommunikation hast :D

Stringize und Token-Pasting Operatoren...ich glaub es hackt gg %)

"Erstmal kleine Kuchen backen" und "Keep it simple" gehört eher nicht zu 
Deinen Mottos, was?

von Karl H. (kbuchegg)


Lesenswert?

A. B. schrieb:

> das ist ja nun nicht der erste Thread in dem mich
> deine arrogante und polemisierende Art ankotzt aber hier isses
> nun wieder mal so weit tataaaaa

Das liegt vielleicht daran, dass ich (und mit mir viele andere hier) 
etwas weiter denken als nur bis zu:
Ich möchte xy machen, habe aber keine Ahnung wie ich anfangen soll und 
was mich erwartet. Aber ich will unbedingt!

zb das hier
> Ich gebe zu, das mit den noch nicht gespeicherten Texten habe
> ich bisher nicht berücksichtigt und das ist ein großes Problem.

Sowohl Rufus als auch ich haben dieses Problem nach 2 Sekunden 
nachdenken identifiziert. Du gehst schon eine ganze Weile mit dem 
Gedanken schwanger und hast dieses Problem nicht gesehen, ehe wir dich 
mit der Nase darauf gestossen haben. Was glaubst du was da alles noch an 
Problemen lauert, an die weder Rufus noch ich momentan denken?

Mit deinem ursprünglichen Ansatz des Hookings haben wir dir jetzt locker 
3 Wochen Entwicklungsarbeit gespart an dessen Ende unweigerlich "so 
gehts nicht" gestanden wäre.

> "Erstmal kleine Kuchen backen" und "Keep it simple" gehört eher nicht zu
> Deinen Mottos, was?

Doch. Zu meinen gehört das schon.
Aber anscheinend nicht zu deinen.

Wie ich schon sagte: Mach mal.

> alle Feinheiten der Sprache C nachzubilden

Sorry. Aber ein typedef ist keineswegs eine Feinheit.
Das ist stink normales C, wie es jeden Tag millionenfach geschrieben 
wird. Komplexe Probleme kann man nun mal nicht mit simplen Strategien 
lösen.


Und arrogant und herablassend werde ich eigentlich nur dann, wenn ich 
denke, wieder mal einen Fall von massloser Unterschätzung des 
Schwierigkeitsgrades vor mir zu haben.
Mit dem Fuss aufstampfen und "Ich will" brüllen funktioniert nicht als 
Problemlösestrategie. Und für eine Problemstellung dieses 
Schwierigkeitsgrades und Komplexität solltest du schon ein paar besser 
ausgearbeitete Konzepte und Strategien haben als "Da hooke ich mal ein 
wenig und der Rest findet sich"

von Karl H. (kbuchegg)


Lesenswert?

Ach ja:

Deine allerbeste Strategie wäre es, mit den Entwicklern der IDE Kontakt 
aufzunehmen, ihnen dein Vorhaben zu schildern und sie zu fragen ob sie 
dir einen Zugang zu
   Projektdaten
   Texten in den Editorbuffern
geben können und eine Benachrichtigung schicken können, wenn sich dort 
etwas ändert (in Form eines Callbacks, Windows Message, was auch immer). 
Sprich: Wenn sie dir eine Plugin-Schnittstelle entweder benennen oder 
implementieren können.

Da so ein VA eine enorme Aufwertung jeder IDE darstellt, kann ich mir 
nicht vorstellen, dass sie abgeneigt sind, diesen normalerweise relativ 
kleinen Aufwand zu treiben. Vielleicht gibt es ja schon eine 
Schnittstelle und du weißt es nur noch nicht?

von Karl H. (kbuchegg)


Lesenswert?

> Hast Du Dir das TextPicker Programm überhaupt angeschaut?

Gegenfrage: Hast du das TextPicker Programm überhaupt ausprobiert?

Mach das mal.
Starte einen Notepad, schreibe was rein und dann sieh nach, was dein 
Textpicker da raus holt :-)

Grob geraten macht dein TextPicker

* Das Window unter der Maus identifizieren (dazu gibt es einen
  Windows-API Call)
* Die Fensterklasse des Windows zu bestimmen (auch dazu gibt es
  einen Windows-API Call, bzw. der steht in der zum HWND gehörenden
  Struktur
* Dem Fenster (je nach Klasse) eine WM_GETTEXT Message (oder das
  jeweilige Äquivalent der konkreten Klasse) schicken.
* Das wars

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Probier einfach mal dieses Textpicker-Tool zusammen mit Firefox aus.

Du wirst überrascht sein.

von Karl H. (kbuchegg)


Lesenswert?

Rufus t. Firefly schrieb:
> Probier einfach mal dieses Textpicker-Tool zusammen mit Firefox aus.
>
> Du wirst überrascht sein.

Was macht er?

Also aus dem Notepad kriegt das Tool bei mir zumindest nichts raus. Und 
Notepad ist so ziemlich der am simpelst aufgebaute Texteditor, den ich 
mir vorstellen kann.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Eben, genau das: Nichts.

von Karl H. (kbuchegg)


Lesenswert?

Rufus t. Firefly schrieb:
> Eben, genau das: Nichts.

LOL
Beim schnellen Ausprobieren war das eigentlich Dauerzustand: nichts 
passiert. Egal wo ich mit der Maus hin bin.

Ich würde mal sagen: Alles was nicht über Controls abgewickelt wird, 
wird nicht funktionieren. Oder hast du schon mal einen MFC-View gebaut, 
der auf eine WM_GETTEXT Message reagiert :-)

Man könnte das natürlich schon trickreich machen. Dem Window einen 
WM_PAINT schicken, dem Teil einen Memory-DC mit einer Bitmap unterjubeln 
(keine Ahnung ob der Teil überhaupt machbar ist) und dann über ein OCR 
versuchen den Text rauszubekommen.
Und natürlich hoffen, dass der View selbst keinen Flickerfree-Memory-DC 
benutzt und tatsächlich immer alles hinpinselt (was bei einem Editor 
eher unwahrscheinlich ist. Das Hinpinseln, nicht das Anti-Flickern)

von A. B. (funky)


Lesenswert?

Also unter Notepad funktioniert das ganze. ja, die Bedienung von dem 
ding ist "bischen" kacke. aber die readme erklärt wie es geht

zwei notepadfenster öffnen. in ein fenster text schreiben, das tool 
aktivieren, maus über den text halten, das türkise quadrat erscheint, 
anklicken, quadrat wird gelb, gelbes quadrat auf anderes fenster ziehen, 
nochmal klicken und text ist kopiert.


Mit Firefox und meiner IDE klappt das ganze nicht. das stimmt leider.

Notepad verwendet für den Textdialog die CEdit Klasse bei dem das 
Textpicker funktioniert.

Bei meiner IDE habe ich gerade geschaut, da ist das Textfenster mit 
WindowsForms und somit .NET realisiert. Wenn ich mir anschaue was da so 
mit der IDE installiert wurde wahrscheinlich .NET 2.1

Der Notepad ist insgesamt irgendwie mitteilsammer. Markiert man Text, so 
werden EM_LINEINDEX und SELECT Ereignisse ausgelöst. Da wird mir sogar 
der markierte Bereich mit angezeigt(habs mit SPY++ angeschaut)

Bei meiner IDE nix dergleichen. KEYUP,KEYDOWN Messages sehe ich, und 
auch die gedrückten Tasten, aber die ganzen Spezialfunktionen sind da 
anderweitig implementiert.

Muss aber auch erstmal bischen über .Net informieren. Keine AHnugn wie 
da was abläuft.

von A. B. (funky)


Lesenswert?

Achso und sorry wegen vorhin @karl-heinz. War nur kurz davor irgendwas 
mit dem Keyboard umzuhauen da mich dein Kommentar in diesem Moment sehr 
erbost hatte :D

Ich halte mein Vorhaben bisher nicht für unlösbar und von daher hat mich 
das auf-eine-Stufe-stellen mit einem Newbie der fragt ob Vista auch auf 
nem Atmel läuft doch ein wenig getroffen :P

von Vlad T. (vlad_tepesch)


Lesenswert?

um was für eine IDE handelt es sich eigendlich?
Was für eine Sprache?

vielleicht kann man ja einfach zu einer Alternativ-Ide zurückgreifen 
(Visual Studio, Eclipse) und diese zum Coden benutzen.
Projektkonfiguration und Erstellen der Makefiles, sowie spezielle 
Funktionen kann man ja der Orginal-Ide überlassen.


So handhabe ich das zB immer.
Die Projekte erstelle und pflege ich im Avr-Studio
Coden/Flashen tue ich im Visual Studio 2005. Da gibts ein vernünftiges 
Sytaxhighlighting und eine verünftige codeverfollständigung.

Das Avr-Studio benutze ich nur, wenn mal ein neues File ins Projekt 
muss, oder wirklich der Simulator gebraucht wird.

Man hat zwar dadurch einne geringen Mehraufwand, weil man das 
Visual-Studio-Projekt und das Avr-Studio-Projekt pflegen muss, aber bei 
ersteren hält sich der Aufwand in grenzen.
Da muss nur einmal die Includepfade angepasst werden und ein paar 
Präprozessor-defines gesetzt werden (nur für die Codeverfollständigung) 
und eingestellt werden, welches Makefile wie aufgerufen werden soll, 
wenn man auf Ausführne klickt (F5 drückt)


Abgesehen davon ist der Visual Assist ein super Tool, was schon einige 
Jahre Entwicklungsarbeit beinhaltet.
Sowas mal ebend nachzubauen ist unrealistisch.

von A. B. (funky)


Lesenswert?

ja, so mache ich es momentan auch.

visual C und die IDE gleichzeitig benutzen. Es geht, aber ist 
umständlich.

Es handelt sich um die PSoC Designer IDE. Ich habe bucheggers Rat 
beherzigt und erstmal beim Hersteller der IDE angefragt ob es da schon 
was undokumentiertes gibt oder sie bereit sind ein kleines API 
einzubauen. Mal sehen was die sagen bevor ich irgendwelche Handstände 
und Frickellösungen probiere.



Und ich sprach nirgends von "mal eben" und ich weiß auch das ich das 
Teil nur rudimentär nachbasteln können werde(da ich es nicht zu meiner 
Lebensaufgabe machen wollte)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.