//Ermittle Handles des Menüs der aktuellen Notepad-Instanz
6
varsysMenu=GetMenu(npHandle.Handle);
7
/*an dieser Stelle wird der npHandle (=> 0x0027083c) zu SysMenu == 0
8
9
10
Warum???
11
12
*/
13
14
15
16
//Wenn das Menü noch keinen Zusatzbutton bekommen hat,
17
//füge den neuen Button hinzu und zeichne Menü neu
18
if(GetMenuItemCount(sysMenu)<6)
19
{
20
InsertMenu(sysMenu,4,MF_BYPOSITION,_CustomMenuID,"MD zu HTML");
21
DrawMenuBar(npHandle.Handle);
22
}
Mit win7 wird der Wert korrekt übergeben und alles läuft, mit win11
nicht.
Hatte ähnliche Probleme mit der path-Variable die einfach ignoriert
wird.
Ich vermute/befürchte irgendwelche Datenschutzbestimmungen - zum
Programmieren äußerst lästig.
Danke für Unterstützung
Geht es immer noch um deinen Versuch, eine IDE zu entwickeln, die keinen
Editor enthält sondern versucht einen externen Editor fernzusteuern?
Ich dachte, du wolltest MS-Word statt Notepad verwenden, weil das schöne
Schriftarten und Farben kann?
Zu deinem Problem: Nur weil das Programm bei beiden Windows-Versionen
"notepad.exe" heißt, muss das nicht identisch sein. Kopier dir das .exe
von Windows 7 auf dein Windows 11, und versuchs damit.
Wenn das funktioniert, hat Microsoft eben nach Jahrzehnten mal wieder
was am Texteditor weiterentwickelt.
Εrnst B. schrieb:
Danke für das Interesse - ja, es geht -auch- um die ide.
habe die win7-exe kopiert auch das funktioniert auf win 11 nicht.
> muss das nicht identisch sein.
1
StringBuildersb=newStringBuilder();
2
GetWindowText(npHandle.Handle,sb,200);
3
4
varwindowTitle=sb.ToString();
5
richTextBoxInfo.Text+=windowTitle+"\r\n";
Bis hier funktioniert es noch, d.h. das np-Fenster wird gefunden und der
Titel ausgelesen.
Andieser Stelle
var sysMenu = GetMenu(npHandle.Handle);
ist offensichtlich ein Fehler weil sysMenu - anders wie in win7 - zu 0
wird.
Es ist nicht die Zuweisung sondern die Funktion, die nicht funktioniert:
[DllImport("user32.dll")]
private static extern IntPtr GetMenu(IntPtr hWnd);
Was machen??
Du koenntest versuchen, den Prozess als Admin zu starten. Ich bin etwas
irritiert, dass Du als normaler Benutzer Prozesse ausserhalb Deiner
Prozessgruppe manipulieren kannst.
Alternativ bei Windows 11 mal an den Rechten des Benutzers drehen
(vulgo: ihn zum Administrator befoerden).
Th.
grundschüler schrieb:> habe die win7-exe kopiert auch das funktioniert auf win 11 nicht.
Hast du auch sicher die kopierte Version gestartet? Über Hilfe > Info
kontrolliert?
Εrnst B. schrieb:> Hast du auch sicher die kopierte Version gestartet?
Ganz sicher. Habe jetzt extra noch einen Button eingebaut um das zu
verifizieren.
Ich bin ja seinerzeit mit dem Bemühen gescheitert, die winapi in meine
ide einzubauen. Es lag an w11 oder an der user32.dll. Ohne Fehlermeldung
hat man keine chance.,
Soweit ich weiß, wurde der Editor (Notepad) in Windows 11 komplett
überarbeitet und die Benutzerschnittstelle basiert jetzt auf XAML. Die
alten (um nicht zu sagen steinzeitlichen) Windows-APIs à la GetMenu,
InsertMenu etc. funktionieren jedoch nur bei alten GDI-basierten
Anwendungen, die noch die systembasierten Menüs verwenden. XAML lässt
sich von außen so nicht manipulieren.
PS: Den Editor (Notepad) von Windows 7 in Windows 11 auszuführen wird
nicht funktionieren, u.a. weil alle mitgelieferten Standard-Programme
von Microsoft mit einer Routine versehen sind, die die
Betriebssystemversion abgleicht. Das ist beispielsweise auch der Grund,
warum man die alten Spiele von Windows 7 unter einer neuen
Windows-Version nicht unmodifiziert verwenden kann.
FS schrieb:> funktionieren jedoch nur bei alten GDI-basierten> Anwendungen
Das könnte die Erklärung sein. Mir geht es ja nicht um notepad sondern
um SciTE. Mit Scite scheint es jetzt auch mit w11 zu funktionieren.
grundschüler schrieb:> Mir geht es ja nicht um notepad sondern> um SciTE.
SciTE verpackt einfach die Scintilla-Texteditor-Komponente in einem Exe.
https://de.wikipedia.org/wiki/Scintilla_(Software)
Du kannst diese Komponente einfach direkt in dein .NET-Programm
reinziehen, und bist sofort alle Interprozess-Komunikations-Probleme
los.
Εrnst B. schrieb:> Du kannst diese Komponente einfach direkt in dein .NET-Programm> reinziehen, und bist sofort alle Interprozess-Komunikations-Probleme> los.
Wie?
Das einfachste wäre, wenn ich direkt in den scintilla-sourcecode meinen
Timer etc. einbauen könnte. Hier fehlt mir irgendwie der Zugang. Bei c#
öffnet man eine *.sln und kann dann das ganze Projekt bearbeiten. Wird
beim scintilla sourcecode wahrscheinlich ähnlich sein. Gefunden habe ich
win32/Scintilla.vcxproj.
Beim Öffen mit vs-studio kommen jede Menge Fehlermeldungen weil
Dateipfade nicht stimmen. Ist das der Zugang zum scintilla-sourcecode?
Wenn ich im Beispielprogramm notepad durch scite ersetze wird der
menu-item korrekt angelegt. Beim Klicken auf dieses Menu wird aber ein
neues Fenster angelegt, so dass getWindowtext nur einen leeren String
liefert:
1
//Ermittle Handles des Menüs der aktuellen Notepad-Instanz
2
varsysMenu=GetMenu(npHandle.Handle);
3
//Wenn das Menü noch keinen Zusatzbutton bekommen hat,
4
//füge den neuen Button hinzu und zeichne Menü neu
5
if(GetMenuItemCount(sysMenu)<10)
6
{
7
InsertMenu(sysMenu,4,MF_BYPOSITION,_CustomMenuID,"MD zu HTML");
grundschüler schrieb:> Das einfachste wäre, wenn ich direkt in den scintilla-sourcecode meinen> Timer etc. einbauen könnte.
Nö.
Du baust Scintilla in dein Programm ein, nicht umgekehrt.
Und dazu musst du nicht den Quelletext verwenden, sondern nimmst was
fertig verpacktes:
https://github.com/jacobslusser/ScintillaNET
Demo, wie das verwendet werden kann:
https://github.com/robinrodricks/ScintillaNET.Demo
Vorschlag: nimm dieses Demo-Projekt als Startpunkt und erweitere darin
deine "Timer etc".
Εrnst B. schrieb:> Vorschlag: nimm dieses Demo-Projekt als Startpunkt und erweitere darin> deine "Timer etc".
"This is an easy to understand C# app demonstrating all the features of
the powerful ScintillaNET text editor component. ScintillaNET is a .NET
wrapper for Scintilla, which is used as the primary code editor in
numerous IDEs. Even the venerable Notepad++ uses Scintilla!"
Danke für deinen sehr konstruktiven Beitrag. Wieder mal, es gibt kaum
Probleme, die nicht schon andere versucht haben zu lösen.
komisch.
Ich kennen KEINE API die nach ihren Aufruf keine Rückmeldung macht.
Woher soll ich als Coder auch wissen, ob dir ihren Job gemacht hat. !??
ABER. Es ist schon vorgekommen, das MS Api-Aufrufe verändert. Weshalb
ich grundsätzlich so aufrufe immer über eine SUB o. Funktion laufen
lassen.
Macht die Wartung eines Programm einfacher.
Ach. Um zu testen ob der richtige Editor aufgerufen wird, gibt es doch
das nette ? <- Fragezeichen :)
Εrnst B. schrieb:> Und dazu musst du nicht den Quelletext verwenden, sondern nimmst was> fertig verpacktes:>> https://github.com/jacobslusser/ScintillaNET
Gibt auch ein NuGet-Package, 3 Klicks und das Scintilla-Control ist auf
der Form...
merciless
Schlaumaier schrieb:> komisch.>> Ich kennen KEINE API die nach ihren Aufruf keine Rückmeldung macht.
Du hast auch nicht die geringste Ahnung von Softwareentwicklung.
Bei Funktionen, die Handles zurückliefern, gibt's eben (wie hier) im
Fehlerfall NULL zurück. Das ist durchaus eine "Rückmeldung", sie sagt
bloss nicht viel aus.
Schlaumaier schrieb:> ABER. Es ist schon vorgekommen, das MS Api-Aufrufe verändert.
Zum Beispiel?
Hmmm schrieb:> Bei Funktionen, die Handles zurückliefern, gibt's eben (wie hier) im> Fehlerfall NULL zurück. Das ist durchaus eine "Rückmeldung", sie sagt> bloss nicht viel aus.
Doch. Sie sagt was aus. Weil die entweder "gut" o. "schlecht" in irgend
einer Form zurück liefert.
Wie man die Rückmeldung zu interpretieren hat, ist eine ganz andere
Sache.
Und die Art der Rückmeldung ist sehr sehr unterschiedlich.
K.a. welche das damals war. Ich hatte jedenfalls mein Ärger damit. Ist
zu Win-3.1 Zeiten gewesen.
Dirk K. schrieb:> Gibt auch ein NuGet-Package, 3 Klicks und das Scintilla-Control ist auf> der Form...
ja, das meinte ich mit
Εrnst B. schrieb:> Du kannst diese Komponente einfach direkt in dein .NET-Programm> reinziehen, und bist sofort alle Interprozess-Komunikations-Probleme> los.
Aber das hattest du ja schon im Ursprungsthread im Februar auch
vorgeschlagen:
Dirk K. schrieb:> Es gibt ein NuGet-Paket für die Benutzung von Scintilla> unter .NET. (Scintilla ist das Texteditor-Control,> Scite ist ein Texteditor, der Scintilla verwendet)
Vielleicht klappt es so besser, wenn er direkt ein Beispielprojekt zum
loslegen hat.
Εrnst B. schrieb:> Vielleicht klappt es so besser, wenn er direkt ein Beispielprojekt zum> loslegen hat.
Ja - genau. Das Demo-Projekt läuft auf c#. Die Darstellung von scintilla
ist im Vergleich zu meiner bisherigen RTBox wunderschön und ich kann
jetzt in Ruhe meine c#-Routinen in dieses Projekt einbauen.