PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Titlecaption von Anwendung umbenennen


RattuS
2010-08-21, 15:47:40
Hallo,

ich suche nach einer Möglichkeit die Titlecaption (also der angezeigte Name der Anwendung in dessen Titelbar und in der Taskleiste) einer beliebigen Anwendung während der Laufzeit umzubenennen. Im .NET gibt es beim Erfassen eines Prozesses leider nur einen readonly-Attribut dafür, vielleicht gibt es aber eine API-Funktion zum Setzen? Im Prinzip würde mir auch ein fertiges Tool genügen, falls es soetwas gibt.

Danke im voraus.

Monger
2010-08-21, 16:04:31
Hmm? Also, eine Windows Form hat ein Attribut namens "Text", was den Inhalt der Titelleiste bestimmt. Und das ist auch schreibbar.

PatkIllA
2010-08-21, 16:07:17
Oder meinst du die von anderen Fenstern?

RattuS
2010-08-21, 19:42:37
Ich meine natürlich fremde Anwendungen. ^^ Ich hab meinem Startbeitrag mal etwas umformuliert.

PatkIllA
2010-08-21, 19:50:28
http://msdn.microsoft.com/en-us/library/ms632644%28VS.85%29.aspx

RattuS
2010-08-21, 20:02:01
Ah natürlich, hab gar nicht an SendMessage gedacht. :rolleyes: Danke!

RattuS
2010-08-30, 23:15:21
Ich scheitere leider beim Umsetzen in C#. Die Message erreicht zwar das Zielfenster, überträgt aber scheinbar einen Leerstring anstatt des im Parameter übergebenen Strings. Ich vermutete erst, dass der Inhalt der Adresse bis zur Übertragung genullt wurde, aber laut Funktionsbeschreibung wird der String in den nicht-verwalteten Speicher kopiert und dieser kann nur explizit manipuliert werden. Hat jemand eine Idee? :confused:


private void RenameWindow(int hWnd, string text)
{
IntPtr textPointer = Marshal.StringToHGlobalAuto(text);
SendMessage(hWnd, 0x0C, 0, (long)textPointer);
}


StringToHGlobalAuto und StringToHGlobalAnsi liefern das gleiche Resultat. Eine explizite Null-Terminierung des Strings ebenso.

robobimbo
2010-08-31, 08:59:11
versuch mal:


[DllImport("user32.dll")]
private static extern IntPtr SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, [MarshalAs(UnmanagedType.LPStr)] string lParam);


...und übergib den String direkt, glaub aber nicht, dass das viel bringt.

RattuS
2010-08-31, 18:33:48
Hilft leider nicht. :(

Markus89
2010-08-31, 19:28:57
Schau dir mal das an: http://boycook.wordpress.com/2008/07/29/c-win32-messaging-with-sendmessage-and-wm_copydata/

Gnafoo
2010-08-31, 19:40:22
Setze mal bei SendMessage explizit die Charset-Eigenschaft des DllImport-Attributs und verwende die entsprechende StringToHGlobal[Auto|Ansi|Uni]-Methode. Oh und nicht vergessen, den Speicher wieder mit FreeHGlobal freizugeben.

RattuS
2010-08-31, 20:42:00
Schau dir mal das an: http://boycook.wordpress.com/2008/07/29/c-win32-messaging-with-sendmessage-and-wm_copydata/
WM_COPYDATA wird leider nicht von allen Anwendungen, die ich manipulieren möchte, verarbeitet. :(

Setze mal bei SendMessage explizit die Charset-Eigenschaft des DllImport-Attributs und verwende die entsprechende StringToHGlobal[Auto|Ansi|Uni]-Methode.
Getan, aber leider auch nicht die Lösung.

Gnafoo
2010-08-31, 21:57:41
Also bei mir geht das. Getestet am Windows Taschenrechner:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;

namespace TestApp2
{
class Program
{
[DllImport("user32.dll", CharSet = CharSet.Unicode)]
static extern IntPtr FindWindow(string className, string windowName);

[DllImport("user32.dll", CharSet = CharSet.Unicode)]
static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam);

const int WM_SETTEXT = 0x0c;

static void Main(string[] args)
{
IntPtr ptr = FindWindow(null, "Rechner");
IntPtr sptr = Marshal.StringToHGlobalUni("Test");

try
{
SendMessage(ptr, WM_SETTEXT, IntPtr.Zero, sptr);
}
finally
{
Marshal.FreeHGlobal(sptr);
}
}
}
}

RattuS
2010-09-01, 02:06:00
Ich habe SendMessage wie im obigen Beispiel jetzt mal mit IntPtr für wParam und lParam überladen und siehe da: es funktioniert. Also wird die Adresse als IntPtr wohl nicht richtig umgewanelt. Danke Gnafoo und allen anderen. :)