Accessing LPARAM param from SendMessage acts weird.

John Chapman johnch_atms at hotmail.com
Sun Nov 4 20:51:23 UTC 2018


On Sunday, 4 November 2018 at 19:06:22 UTC, Mark Moorhen wrote:
> Another Windows challenge:
>
> I'm trying to get the title of the active window even if it is 
> from an external application. This is what I've come up with so 
> far:
>
> <D>
> import std.stdio;
> import core.sys.windows.windows;
>
> extern (Windows)
>
> void main()
> {
> 	HWND foreground = GetForegroundWindow();
> 	const(wchar) title;
>
> 	int length = SendMessage(foreground, WM_GETTEXTLENGTH, 0, 0);
> 	SendMessage(foreground, WM_GETTEXT, length, 
> LPARAM(title));			//LPARAM is a Long Pointer
>
> 	writeln(length);
> 	writeln(title);
>
> }
> </D>
>
> Outputs :
>
> 27
>                                                       ´┐┐
>
> So the lengt of the foreground windows title should be 27 chars 
> long, but the title is only 3 chars (and kinda funny ones too:-(
>
> Anyone ideas?

You need to allocate some memory to receive the string from 
WM_GETTEXT.

   auto length = SendMessage(foreground, WM_GETTEXTLENGTH, 0, 0);
   auto buffer = new wchar[length + 1]; // +1 for the trailing 
null character
   SendMessage(foreground, WM_GETTEXT, buffer.length, 
cast(LPARAM)buffer.ptr);
   auto title = cast(wstring)buffer[0 .. length];
   writeln(title);


More information about the Digitalmars-d-learn mailing list