body { margin:0px; padding:0px; background:#f6f6f6; color:#000000; font-size: small; } #outer-wrapper { font:normal normal 100% 'Trebuchet MS',Trebuchet,Verdana,Sans-Serif; } a { color:#DE7008; } a:hover { color:#9E5205; } a img { border-width: 0; } #content-wrapper { padding-top: 0; padding-right: 1em; padding-bottom: 0; padding-left: 1em; } @media all { div#main { float:right; width:66%; padding-top:30px; padding-right:0; padding-bottom:10px; padding-left:1em; border-left:dotted 1px #e0ad12; word-wrap: break-word; /* fix for long text breaking sidebar float in IE */ overflow: hidden; /* fix for long non-text content breaking IE sidebar float */ } div#sidebar { margin-top:20px; margin-right:0px; margin-bottom:0px; margin-left:0; padding:0px; text-align:left; float: left; width: 31%; word-wrap: break-word; /* fix for long text breaking sidebar float in IE */ overflow: hidden; /* fix for long non-text content breaking IE sidebar float */ } } @media handheld { div#main { float:none; width:90%; } div#sidebar { padding-top:30px; padding-right:7%; padding-bottom:10px; padding-left:3%; } } #header { padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; border-bottom:dotted 1px #e0ad12; background:#F5E39e; } h1 a:link { text-decoration:none; color:#F5DEB3 } h1 a:visited { text-decoration:none; color:#F5DEB3 } h1,h2,h3 { margin: 0; } h1 { padding-top:25px; padding-right:0px; padding-bottom:10px; padding-left:5%; color:#F5DEB3; background:#DE7008; font:normal bold 300% Verdana,Sans-Serif; letter-spacing:-2px; } h3.post-title { color:#9E5205; font:normal bold 160% Verdana,Sans-Serif; letter-spacing:-1px; } h3.post-title a, h3.post-title a:visited { color: #9E5205; } h2.date-header { margin-top:10px; margin-right:0px; margin-bottom:0px; margin-left:0px; color:#777777; font: normal bold 105% 'Trebuchet MS',Trebuchet,Verdana,Sans-serif; } h4 { color:#aa0033; } #sidebar h2 { color:#B8A80D; margin:0px; padding:0px; font:normal bold 150% Verdana,Sans-serif; } #sidebar .widget { margin-top:0px; margin-right:0px; margin-bottom:33px; margin-left:0px; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; font-size:95%; } #sidebar ul { list-style-type:none; padding-left: 0; margin-top: 0; } #sidebar li { margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; list-style-type:none; font-size:95%; } .description { padding:0px; margin-top:7px; margin-right:12%; margin-bottom:7px; margin-left:5%; color:#9E5205; background:transparent; font:bold 100% Verdana,Sans-Serif; } .post { margin-top:0px; margin-right:0px; margin-bottom:30px; margin-left:0px; } .post strong { color:#000000; font-weight:bold; } pre,code { color:#999999; } strike { color:#999999; } .post-footer { padding:0px; margin:0px; color:#444444; font-size:80%; } .post-footer a { border:none; color:#968a0a; text-decoration:none; } .post-footer a:hover { text-decoration:underline; } #comments { padding:0px; font-size:110%; font-weight:bold; } .comment-author { margin-top: 10px; } .comment-body { font-size:100%; font-weight:normal; color:black; } .comment-footer { padding-bottom:20px; color:#444444; font-size:80%; font-weight:normal; display:inline; margin-right:10px } .deleted-comment { font-style:italic; color:gray; } .comment-link { margin-left:.6em; } .profile-textblock { clear: both; margin-left: 0; } .profile-img { float: left; margin-top: 0; margin-right: 5px; margin-bottom: 5px; margin-left: 0; border: 2px solid #DE7008; } #sidebar a:link { color:#999999; text-decoration:none; } #sidebar a:active { color:#ff0000; text-decoration:none; } #sidebar a:visited { color:sidebarlinkcolor; text-decoration:none; } #sidebar a:hover { color:#B8A80D; text-decoration:none; } .feed-links { clear: both; line-height: 2.5em; } #blog-pager-newer-link { float: left; } #blog-pager-older-link { float: right; } #blog-pager { text-align: center; } .clear { clear: both; } .widget-content { margin-top: 0.5em; } /** Tweaks for layout editor preview */ body#layout #outer-wrapper { margin-top: 0; } body#layout #main, body#layout #sidebar { margin-top: 10px; padding-top: 0; } -->

Tuesday, October 16, 2007

[C++/CLI]Send WM_GETTEXT Message from Managed

I've read interesting question from msdn forum.


He is going to Send WM_GETTEXT Message to other window's child control from CLI program.



I thought it'll very helpful for my study.
I use IneropServices namespace.
It's for call unmanaged function easily.



using namespace System;

using namespace System::Runtime::InteropServices;

using namespace System::Text;

[DllImport("User32.dll", EntryPoint = "FindWindow",CallingConvention = CallingConvention::Cdecl, CharSet = CharSet::Ansi)]

IntPtr FindWindow(
System::String^ lpClassName, System::String^
lpWindowName);


[DllImport("User32.dll", EntryPoint =
"FindWindowEx",CallingConvention = CallingConvention::Cdecl, CharSet =
CharSet::Ansi)]

IntPtr FindWindowEx( IntPtr parent, IntPtr childAfter,
System::String^ lpClassName, System::String^ lpWindowName);


[DllImport("user32.dll", EntryPoint =
"SendMessage", CallingConvention =
CallingConvention::Cdecl, CharSet = CharSet::Ansi)]

IntPtr SendMessage(IntPtr
hWnd, System::UInt32 Msg, IntPtr wParam,
IntPtr lParam);

After declaring unmanaged function explicitly, You can easily using unmanaged function with InteropServices.

Important thing is Be aware of managed and unmanaged type compatible.

IntPtr is for HWND( == void*) type.

Then I'm going to find window and send WM_GETTEXT message to it's child window.

const UInt32 WM_GETTEXT = 0x000D;

IntPtr wp, lp;

Char str[100] = {0,}; //buffer for child control's text

Int32 len =20;

//Find Window caption is "FindWindowTest"

IntPtr Parenthwnd = FindWindow(nullptr, "FindWindowTest");

//Then Find Parenthwnd window's child Edit control

IntPtr childWnd = FindWindowEx(Parenthwnd, (IntPtr)0, "Edit", nullptr);

//Then Send WM_GETTEXT Message

IntPtr r = SendMessage(childWnd, WM_GETTEXT,

safe_cast(len), safe_cast<IntPtr>(str));

Then I got a some text from Edit box.

But It's broken..

Because, C++/CLI using Unicode, but Edit box is not.

So I should convert it.

C++/CLI support various converting classes.

UTF32Encoding^ u32LE = gcnew UTF32Encoding(false, true,true );

String^ UnicodeStr = gcnew String(str);

array^myBytes = gcnew array(u32LE->GetByteCount( UnicodeStr ));

u32LE->GetBytes(UnicodeStr, 0, UnicodeStr->Length, myBytes,0 );

array^ newBytes = gcnew array(myBytes->Length);

//myBytes still has problem.

//after encoding UTF32, there are double null character.

//below code eliminate double null character.

int destIdx = 0;

for (int idx=0; idxLength-1; idx++)

{

if (idx+1 != myBytes->Length)

{

if(myBytes[idx] == 0 && myBytes[idx] == 0)

{

idx++;

}

else

{

newBytes[destIdx++] = myBytes[idx];

}

}

}

//newBytes is ASCII Code. Still can't get text

//It shoud be Decode.

array<Char>^ chars = gcnew array(100);

Decoder^ d = Encoding::ASCII->GetDecoder();

int charLen = d->GetChars(newBytes, 0, newBytes->Length, chars, 0);

String^ ConvertedStr = gcnew String(chars);

//Finally we got text, we can read