Link to home
Start Free TrialLog in
Avatar of Zoplax
Zoplax

asked on

Grab text as it arrives in a RichEdit belonging to an external chat program?

I'm creating a C# app which will monitor a chat program's main chat window (a RichEdit control).  I've successfully coded to grab the handle to the RichEdit control, and do stuff like grab the last line of text (using SendMessage along with EM_GETLINE, for example).

However, I'm stumped on how to fire off an event to my C# app when new text enters the foreign chat window. For example, if someone says "hi", I want my app to be able to react and grab the text.  Specifically, the chat program appears to fire off an EM_REPLACESEL message containing the new text.

I need details on how to make it so that my app can be made aware of new text arriving in the foreign app's RichEdit control, so that I can then process the new text.  I don't want to poll for new messages, rather I want to be able to respond to an event created as a result of new text arriving in the RichEdit control.  Maybe using a local hook?  I don't know.

The person providing the best, most detailed solution wins all 500 points.  Please help, thanks.  :-)
Avatar of programmer1024
programmer1024

Maybe you want to use the TextChange event? That will fire everytime a key is pressed though, so you'd have to find out when they stopped entering text.
Avatar of Zoplax

ASKER

The chat application is external to my own, and isn't a C# or .NET application, and also I don't see the users' keypresses just the messages, so I don't know how to access its events other than through Windows messaging.
try to create a windows service that write keystrokes to alog file instead of windows application..
cheers
Avatar of Zoplax

ASKER

Again my app won't be running such that it can capture user keystrokes at all, it runs alongside the chat program and can only see incoming lines of text from users, not watch them as they type.  Writing keystrokes won't work at all in this case.
Hai2u,

Have you tried hooking the WndProc of that specific control (I am guessing you have that controls handle) - it should work the same way as you would hook a window. After that is done, open up spy++ and find that control - hook its messages and observe what kinds of messages are received upon text update. You simply add, in your code, a call to the methods you say already work, when that message is received to the WndProc

Lookup: SetWindowsHookEx for the hooking api, and don't forget to remove it :)

Hope I help,
Cheers
Shai
Avatar of Zoplax

ASKER

Shai I think I've seen some examples illustrating what you're talking about; if I understand correctly, the WndProc is overridden in my app so that I can see all messages arriving to the RichEdit control, and then I would create an event handler which watches the control's messages intercepted by my WndProc...?

Some sample code would be a big help here.  
Hai2u again,

Yes, but each control is a sort of small windows application on its own, makes you able to catch the messages dropped to that specific control only.

http://support.microsoft.com/default.aspx?scid=kb;en-us;318804 has the out of the box solution. I'll try making you one that actually does what you need during the day (at work, kinda hellish today xD)

Cheers,
Shai

Avatar of Zoplax

ASKER

Thanks much!  I look forward to seeing your example.  
Avatar of Zoplax

ASKER

Shai, any luck?  So far you're the prime contender for the points if you're able to provide me a solution.

Hey Zoplax,

I aint doing this for the points lol :p

But no, I hadn't the time to try doing a full sample here, as i said before - work is hellish...

I have not forgotten and if you dont mind waiting - I will probably have time in the next few days.

FYI, answers are usually not fully coded things - but mostly leads to a solution. This site, after all, is not rent a coder for free ;)

Meanwhile - I do suggest reading the sample by microsoft - it helps alot

Cheers,
Shai
Avatar of Zoplax

ASKER

No I'm fine with waiting; I've done a lot of my own research but I don't have enough experience under my belt to try some of the ideas I've read about so far.  And my own work is hellish on its own, so much so that lately I've wanted to stay away from my computer as much as possible on my off time.  :-D

I know this isn't a rent-a-coder site too btw, this is just the third time I've asked a question specific to what I'm trying to do here, and so far yours is the best response I've gotten; the other questions are abandoned with no fruitful replies.  

I will check out that sample in the meantime and try to apply it to my C# app for what I'm trying to do.
Avatar of Zoplax

ASKER

Shai, here's something I found which I'd appreciate your or anyone else's opinion about:

http://groups.google.com/group/microsoft.public.dotnet.languages.csharp/browse_thread/thread/889cf15d69810336/83e8b766cdf7a15d?lnk=st&q=GetMsgProc+csharp&rnum=1&hl=en#83e8b766cdf7a15d

This posting describes some code which appears to hook into a process by its Thread ID.  The hook they use (WM_GETMESSAGE) I think would enable me to monitor the messages I need to keep track of in the chat program.  Would I be able to utilize a similar method to this if I can grab the thread ID of the chat application instance?  And if so, how would I get a thread ID in this way?

Hello again,

Yes, it's uses the same API as the microsoft link I provided earlier.

Actually, today is abit less hectic and I might do it in the next few hours :P

What I'm going to do is this:

Create a winform app with a rich text box.
Create a winfrom app that hooks the other app and loggs events from the rich text box

Would that be what you need?

Cheers,
Shai
Zoplax,

I've looked into the problem a little more, and what I've found out is this: http://msdn.microsoft.com/msdnmag/issues/06/04/ManagedSpy/

what you should be doing is read through all the document explaining what is the managed spy

and the next thing you should do is download the ManagedSpyLib from Microsot (.NET 2.0)

In the library, you will find ControlProxy which represents a control in a different process (a problem with managed code hooking)

You should create a instance of that class using ControlProxy.FromHandle and send the handle (which you wrote you had)

After you've done that - you may access all the events and access the values of the control.

This library is built on C++ unmanaged code.

I personally work with .NET 1.1 - Thus cannot create a sample for you using that library

Hope you can manage,
Cheers,
Shai
hi there...sorry for being late..

you can find these two projects very usefull especially the first one..but it is in VB:

http://www.planetsourcecode.com/vb/scripts/ShowCode.asp?txtCodeId=2971&lngWId=10

http://www.planetsourcecode.com/vb/scripts/ShowCode.asp?txtCodeId=3080&lngWId=10


GOOD LUCK
Avatar of Zoplax

ASKER

t_itanium, please read the above posts, I do NOT need code for a keylogger.  Again, the application I'm trying to monitor has a RichEdit control which is used for chat messages, but I'm not running the monitoring app on the chat users' PCs, this is running solely on my PC and the chat messages are arriving via that program, not through the keyboard.  Thanks anyway.

Shai, I will look at the info you linked me to, yeah I figured there would be complications since the program I'm monitoring isn't .NET itself.
Zoplax,

Its not a complication of the target application
It's just that the windows API has a little problem with accessing different processes' hooks - its not impossible - but totally pointless to implement on ur own when they release a library that does everything that Spy++ does with no effort :P

Cheers and Good luck
Shai
hi again...
here what you  can do.... you can use what i gave you as aprogram that run on the chat computer ...or a service.....and you can use .net remoting that allow this program or service to send information to your PC via tcp ip or any other ...

cheers
Avatar of Zoplax

ASKER

t_itanium, I don't have access to the remote computers at all, just to the instance of the chat program that's running on my computer and seeing the messages arrive in its RichEdit control.

So far Shai's suggestion about the ManagedSpyLib sounds like the most promising solution.  I'm going to take a closer look and see if I can code a sample to test it out.
Avatar of Zoplax

ASKER

Sorry it's been a while.  Shai, I read the ManagedSpy article more closely and it sounds like it won't work for my application.

"...ManagedSpy can only show information on .NET Framework-based controls, it doesn't display other window types."

"ManagedSpy is written on top of a *managed* [NOT unmanaged] C++ library called ManagedSpyLib. The purpose of ManagedSpyLib is to allow *programmatic access to .NET Framework-based windows* in another process."

Based on this it sounds like it won't do, the application I'm trying to monitor is NOT .NET based, it was written in non-.NET (unmanaged) C++.  If this is indeed the case, any other suggestions?
ASKER CERTIFIED SOLUTION
Avatar of shtson
shtson
Flag of Israel image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Avatar of Zoplax

ASKER

The accepted solution will be more work than I'd preferred, but it's the best idea so far.
If it was easy, you wouldn't be asking in ee - would ya ;)

Cheers and Thank you,
Shai