Entwickler-Ecke

Windows API - Titelleiste fremder Anwendungen um Buttons erweitern


Nano-Ware - So 30.10.11 21:21
Titel: Titelleiste fremder Anwendungen um Buttons erweitern
Hey,

wie kann ich die Titelleiste ANDERER Programme um weitere Buttons (neben Maximieren, Minimieren, ...) erweitern? Es muss bei jedem anderen Programm sein. Geht das irgendwie? Und wenn möglich performant.

Dankeschön


platzwart - So 30.10.11 22:26

Nein, das ist so nicht ohne weiteres möglich.


Nano-Ware - So 30.10.11 22:40

Ich kenne viele Programme, bei denen das "scheinbar" ohne weiteres geht. Ich hab nur leider keine Idee, wie das gehen könnte, ich weis nur, dass es geht (; und ich hoff ihr könnt mir in Sachen "wie" helfen.


Boldar - So 30.10.11 23:11

Normale Buttons und Controls kann man jedenfalls erzeugen, indem man (zb. mit CreateRemotethread) im Kontext des anderem Prozesses das Control erstellt, den Parent richtig setzt und einen Handler für die Messages bereitstellt. Das habe ich schonmal irgendwo gesehen.


Nano-Ware - So 30.10.11 23:34

Ich kann mit der Antwort leider nicht anfangen. Währe es Möglich ein Codebeispiel zu geben?

Danke


jaenicke - Mo 31.10.11 02:52

So einfach ist das nicht. Ich habe es noch nicht einmal im eigenen Programm wirklich gut hinbekommen. Und es gibt auch nicht viele Programme, die das so gut hinbekommen wie z.B. TeamViewer.


Tranx - Mo 31.10.11 13:59

Das Problem ist nicht, dass es möglich ist, in einem anderen Programm Buttons zu hinterlegen. Aber ich meine, dass - wenn das so einfach wäre, den Hackern wirklich JEDE Tür geöffnet wäre, das Programm nach belieben zu manipulieren, und spätestens dann wird das zu einem Problem.

Außerdem, was soll denn der zusätzlich Button bewirken? Jedes Programm hat doch sehr unterschiedliche Aufgaben. Das eine bearbeitet Texte, das andere Bilder, das nächste eine Datenbank, dann gibt es Auswerteprogramme für Messgeräte, Simulationsprogramme, Spiele .... Da kann doch ein einfacher Button nicht bei jedem Programm Sinnvolles bewirken, oder? Oder soll bloß das Programm ferngesteuert geschlossen werden oder ähnliche "globale" Operationen, die nichts mit der eigentlichen Aufgabe des Programms zu tun haben.


jaenicke - Mo 31.10.11 14:56

user profile iconTranx hat folgendes geschrieben Zum zitierten Posting springen:
Da kann doch ein einfacher Button nicht bei jedem Programm Sinnvolles bewirken, oder?
Es gibt dafür durchaus Anwendungszwecke, siehe TeamViewer, wo du das Fenster alleine fernsteuern lassen oder remote anzeigen kannst.

Ein Problem ist aber, dass die Programme voneinander nichts wissen und so die Buttons schon mal übereinander landen. Deshalb wäre da ein horizontaler manueller Offset sehr wichtig (den bisher noch kein solches Programm hat).


Tranx - Mo 31.10.11 15:00

Aber Teamviwer arbeitet doch nicht über Buttons, sondern - wenn ich das recht verstehe - über Tastatur- und Maus-Ereignisse. Es nutzt die normale Softwareumgebung und macht nichts anderes, als dass nicht die Tastatur und die Maus des Arbeitsplatzrechners, sondern eines Remoterechners die Befehler gibt.

Oder liege ich da völlig verkehrt? Wenn bei uns der IT-Dienstleister mit Teamviewer auf unserem Server arbeitet, passiert genau das von mir Beschriebene.


vagtler - Mo 31.10.11 16:07

TeamViewer kann noch einiges mehr - u.a. die von Sebastian beschriebenen Funktionalitäten.


Delete - Mo 31.10.11 16:31

Für die Phantasielosen, die nicht wissen, für was ein zusätzlicher Button sinnvoll ist:

MultiMon erzeugt für jedes Window einen zusätzlichen Button, um ein Fenster zwischen 2 Monitoren mit einem Klick hin und her zu schieben.

http://www.mediachance.com/free/multimon.htm
http://www.mediachance.com/free/mmtaskbar21.exe


jaenicke - Mo 31.10.11 17:50

@user profile iconTranx: Das sieht so aus:

TeamViewerWindowsButton


Nano-Ware - Di 01.11.11 23:53

Ja und genau sowas, wie Herr Jaenicke gepostet hat, möchte ich irgendwie hinbekommen. Das Programm an dem ich schreibe, soll das Anordnen von Fenstern leichert gestalten. Nur hängt das ganze Projekt jetzt schon an diesem kleinen Schritt. Ich hab auch im Internet nichts Brauchbares gefunden, deshalb hoffe ich auf euch, dass ihr eventuell noch Ideen habt.


jaenicke - Mi 02.11.11 14:39

user profile iconNano-Ware hat folgendes geschrieben Zum zitierten Posting springen:
Nur hängt das ganze Projekt jetzt schon an diesem kleinen Schritt. Ich hab auch im Internet nichts Brauchbares gefunden
Es ist kein kleiner Schritt, sondern wahrscheinlich der größte des gesamten Projekts. ;-)
Ich habe es bisher leider auch nie brauchbar hinbekommen (sprich so, dass es auch aussieht wie es sonst im System aussieht).


vagtler - Mi 02.11.11 15:34

Das dürfte Stoff für einige lange Abende bieten:

http://stackoverflow.com/questions/272440/how-to-add-button-to-other-apps-window-title-bar-xp-vista
http://stackoverflow.com/questions/2841180/how-to-add-an-extra-button-to-the-windows-title-bar
http://www.thecodeking.co.uk/2007/09/adding-caption-buttons-to-non-client.html
http://msdn.microsoft.com/en-us/library/bb688195%28VS.85%29.aspx

Du könntest auch mal die Jungs von http://www.xtrabuttons.com/ fragen. Die haben das in ihrer Freeware ja anscheinend auch ganz gut hinbekommen...


Nano-Ware - Mi 02.11.11 22:03

Okay das ist mir alles zu kompliziert. Ich fang mal einfacher an: Wie kann ich einem fremdem Fenster einen Button hinzufügen und dessen Events abfangen? :3


vagtler - Do 03.11.11 09:59

http://blogs.microsoft.co.il/blogs/shair/archive/2010/05/06/add-your-control-on-top-another-application-part-1-win32.aspx
http://blogs.microsoft.co.il/blogs/shair/archive/2010/05/09/add-your-control-on-top-another-application-part-2-win32.aspx
http://blogs.microsoft.co.il/blogs/shair/archive/2010/05/10/add-your-control-on-top-another-application-part-3-win32.aspx

user profile iconNano-Ware hat folgendes geschrieben Zum zitierten Posting springen:
[...] Ich fang mal einfacher an: Wie kann ich einem fremdem Fenster einen Button hinzufügen und dessen Events abfangen? :3

Das ist ungefähr das gleiche - Du musst halt nur nicht in die Title-Bar zeichnen.


Nano-Ware - Fr 04.11.11 00:02

Danke. Ich hab nur etwas Probleme, die C#-Codes in vernümpftiges Delphi zu ändern und Delphibeispiele zu dem Thema habe ich nicht gefunden. Ich möchte jetzt keine neue Sprache lernen, um etwas in Delphi zu programmieren. Vielleicht könnt ihr helfen


vagtler - Fr 04.11.11 10:17

Grundsätzlich dürfte das auf Grund der Ähnlichkeit der Sprachen eigentlich kein Problem darstellen. Frag doch bitte im Einzelfall konkret, bei welchen Sprachkonstrukten Du Schwierigkeiten siehst.


Nano-Ware - Di 08.11.11 21:12

Ich hab mir das jetzt sehr intensiv angeschaut, aber das kann keine Lösung sein. Das angehängt Demo-Projekt erstellt lediglich ein Fenster, das sich an die Position des Fensters heftet. Bei dem besagten Projekt verschiebt sich das Ganze nichteinmal mit dem Fenster. Ich kann mir auch kaum vorstellen, wenn ich das mit einem Timer macht, dass das flüssig läuft und nicht etwa ruckelt. Desweiteren müssen diese Buttons ja auf ALLEN Fenstern sein. Das würde bedeuten ich müsste für jedes offene Fenster eine einzelne Instanz der Buttonanwendung erzeugen, was ja im Grunde kein Problem ist, nur wenn man nun mal ein Fenster über ein anderes schiebt kommen Fehler durch überlappen. Ich denke mal nicht, dass es eine schöne WinAPI-Funktion gibt mit der ich die Reihenfolge aller Fenster ausgeben kann und meins dann nach Belieben dazwischenschieben kann.

Ich hoffe ihr könnt mir helfen ich möchte dazu noch sagen, dass das ein Projekt ist, dass ich immer schonmal machen wollte nur vor 3 Jahren war das nach meinem Kentnisstand einfach nicht machbar. Ich muss das jetzt irgendwie schaffen...


vagtler - Di 08.11.11 21:39

user profile iconNano-Ware hat folgendes geschrieben Zum zitierten Posting springen:
Ich hab mir das jetzt sehr intensiv angeschaut, aber das kann keine Lösung sein. Das angehängt Demo-Projekt erstellt lediglich ein Fenster, das sich an die Position des Fensters heftet. Bei dem besagten Projekt verschiebt sich das Ganze nichteinmal mit dem Fenster. [...]

Ich habe jetzt keinen blassen Schimmer, von welchem Demo-Projekt Du sprichst, aber solltest Du das von Shai Raiten meinen, so ist das nicht korrekt.

Hier ist alles nochmal zusammengefasst: http://www.codeproject.com/KB/cs/WindowHook.aspx

Zitat:
[...] Ich kann mir auch kaum vorstellen, wenn ich das mit einem Timer macht, dass das flüssig läuft und nicht etwa ruckelt. [...]

Natürlich macht man das nicht mit Timern, sondern hookt die Events.

Zitat:
[...] Desweiteren müssen diese Buttons ja auf ALLEN Fenstern sein. Das würde bedeuten ich müsste für jedes offene Fenster eine einzelne Instanz der Buttonanwendung erzeugen, [...]

Nein, wieso?

Zitat:
[...] Ich hoffe ihr könnt mir helfen [...]

Nochmal: frag konkret!


Nano-Ware - Di 08.11.11 23:30

Mein Problem ist einfach, dass ich jetzt in einen Bereich des Lernens komme, bei dem ich nicht einfach mal in Google nach "Wie färbt man einen Button" suchen kann. Ich bin durchaus in der Lage die Position eines Fensters durch WinAPI auszulesen, aber das war es halt. Ich würde jetzt ohne weiteres Wissen einfach einen Timer darauf loshetzen, der dann alle 10ms prüft, ob sich die Position verändert hat und dann mein Control verschiebt. Nur das geht ja leider nicht sehr performant.
Ich bitte euch einfach nur mir irgendwelche Ansätze zu geben oder einfach das, was für mich neu ist, nämlich das Control quasi in ein fremdes Fenster zu integrieren ,erklären könntet. Ich habe schon den ganzen gestrigen Tag damit verbracht eine Lösung zu finden aber mir fehlt es einfach an Wissen..

Vielen Dank vor allem dir vagtler

EDIT// Ich hab mir auch mal das Demo-Projekt von CodeProject geladen, aber außer schönes Flackern und wirres rumgeschwirre funktioniert außer dem setzen des Controls nichts.. Ich bin leicht verzweifelt..


Nano-Ware - So 13.11.11 13:53

Wie gesagt, ich hab mir das Demo-Projekt geladen und es funktioniert einfach garnicht. Habt ihr denn keine Idee, wie man das bewerkstelligen kann?