IntPtr zu Stream?

02/03/2010 - 10:01 von Christoph Engelhardt | Report spam
Hallo NG,

Ich will gerade aus einer Multiline-Textbox einer anderen Anwendung
den Text auslesen.
Nach etwas Recherche habe ich rausgefunden, dass WM_GETTEXT nicht
funktioniert und man EM_STREAMOUT verwenden soll.

Ich verwende folgenden Code:
delegate uint EditStreamCallback(IntPtr dwCookie, IntPtr pbBuff, int
cb, out int pcb);

struct EDITSTREAM
{
public IntPtr dwCookie;
public uint dwError;
public EditStreamCallback pfnCallback;
}

[DllImport("user32.dll", CharSet = CharSet.Auto)]
static extern IntPtr SendMessage(HandleRef hwnd, uint msg,
uint
wParam, ref EDITSTREAM lParam);


###########################
Mein Problem: Wie konvertiere ich den IntPtr pbBuff von
EditStreamCallback in einen Stream o.à. aus dem ich lesen kann? In
Marshal. habe ich nichts gefunden, was mir weiterhelfen würde.

Vielen Dank!

Gruß Christoph
 

Lesen sie die antworten

#1 Kerem Gümrükcü
02/03/2010 - 12:02 | Warnen spam
Hallo Christoph,

so wie es aussieht, ist das eine einfache abfolge von bytes
die da zurückgegeben werden, bzw. ein zeiger auf einen
speicherbereich mit bytes die den stream darstellen. Getestet
habe ich folgenden code nicht, habs auch jetzt mal nur aus
dem kopf und stehgreif geschrieben, sollte dir aber eine
richtung weisen, bzw, veràndere das dann das es funtkioniert:

Als grundlage nehme ich mal deine delegaten (beachte, das
ich keine fehlerbehandlung eingebaut habe!):

private uint EditStreamFunc(
IntPtr dwCookie,
IntPtr pbBuff,
int cb,
out int pcb)
{
int bytesRead = 0;

//erzeuge datenpuffer aus bytes
byte[] buffer = new byte[cb];

//kopiere daten in den byte puffer
//und das kann man schon mit
//System.Text.Encoding.Default.GetString(buffer);
//in einen text verwandeln, beachte aber ob
//der text UNICOE oder ANSI oder was anderes
//ist, also das encoding beachten!
Marshal.Copy(pbBuff, buffer, 0, cb);

//erzeuge einen MemoryStream der zu einem stream mappt

Stream s = new MemoryStream(buffer);

//oder einen reinen MemoryStream

MemoryStream ms = new MemoryStream(buffer);

//je nach dem, was du willst

//verarbeite hier die daten wie du magst

pcb = bytesRead;
return 0;
}


Aber Du musst auch folgendes beachten: Ist der Text in der
Textbox Unicode oder Ansi und noch einige andere Sachen
(siehe doku!)

Ich hoffe, das hilft dir weiter,

Grüße

Kerem

Beste Grüsse / Best regards / Votre bien devoue
Kerem Gümrükcü
Latest Project: http://www.pro-it-education.de/soft...iceremover
Latest Open-Source Projects: http://entwicklung.junetz.de

Ähnliche fragen