Forum: PC-Programmierung winapi, win11 und Datenschutz


von grundschüler (Gast)


Lesenswert?

Ich versuche mich gerade an der Winapi mit c# anhand von
https://code-bude.net/2014/08/27/beliebige-programme-per-csharp-manipulieren/

Das Beispielprogramm läuft auf meinem Win7-Rechner. Auf meinem 
Win11-Rechner nicht. Keine Fehlermeldung, aber es passiert auch nichts.
1
      //Ermittle das Handles des Textfeldes der aktuellen Notepad-Instanz
2
                //und speichere es, um später den Text auszulesen
3
                handlesNpEdit.Add(npHandle.Handle, FindWindowEx(npHandle.Handle, IntPtr.Zero, "Edit", IntPtr.Zero));
4
5
                //Ermittle Handles des Menüs der aktuellen Notepad-Instanz
6
                var sysMenu = 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

von Εrnst B. (ernst)


Lesenswert?

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.

von grundschüler (Gast)


Lesenswert?

Ε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
    StringBuilder sb = new StringBuilder();
2
               GetWindowText(npHandle.Handle, sb, 200);
3
 
4
                var windowTitle = 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.

von grundschüler (Gast)


Lesenswert?

Es ist nicht die Zuweisung sondern die Funktion, die nicht funktioniert:

    [DllImport("user32.dll")]
        private static extern IntPtr GetMenu(IntPtr hWnd);

Was machen??

von Thomas W. (Gast)


Lesenswert?

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.

von Εrnst B. (ernst)


Lesenswert?

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?

von grundschüler (Gast)


Lesenswert?

Ε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.,

von FS (Gast)


Lesenswert?

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.

von FS (Gast)


Lesenswert?

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.

von grundschüler (Gast)


Lesenswert?

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.

von Εrnst B. (ernst)


Lesenswert?

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.

von grundschüler (Gast)


Angehängte Dateien:

Lesenswert?

Ε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
                var sysMenu = 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");
8
                    DrawMenuBar(npHandle.Handle);
9
                }
10
11
                //Hook setzen, um Windows-Nachrichten abzufangen
12
                procDelegate = new WinEventDelegate(WinEventProc);
13
                hhook = SetWinEventHook(EVENT_OBJECT_INVOKED, EVENT_OBJECT_INVOKED, IntPtr.Zero,
14
                        procDelegate, 0, 0, WINEVENT_OUTOFCONTEXT);

Ich vermute den Fehler bei SetWinEventHook??

von Εrnst B. (ernst)


Lesenswert?

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".

von grundschüler (Gast)


Lesenswert?

Ε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.

von Schlaumaier (Gast)


Lesenswert?

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 :)

von Dirk K. (merciless)


Lesenswert?

Ε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

von Hmmm (Gast)


Lesenswert?

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?

von Schlaumaier (Gast)


Lesenswert?

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.

von Εrnst B. (ernst)


Lesenswert?

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.

von grundschüler (Gast)


Lesenswert?

Ε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.

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.