Click here to Skip to main content
15,867,686 members
Articles / Desktop Programming / MFC
Article

Sending a message to the Main Frame Window of Another Application, given only the Process Handle

Rate me:
Please Sign up or sign in to vote.
3.62/5 (12 votes)
8 Dec 1999 219.5K   73   28
Explains how to send a message between windows when you only have the Process handle

In order to send a message to another process, it is necessary to know the handle of the receiving window. However, if that process is created using CreateProcess or opened using OpenProcess, only the handles of the process and of it's main thread are known.

It is normally possible to find the window, if the title is known, simply by enumerating all windows and searching for the right window. When the name is unknown however, it is a little more complex to get its handle.

In order to find that handle it is, however, possible to scan all top-level windows and compare each window process Id with the Id received from the CreateProcess or the OpenProcess function. Please take note that not all Windows messages can be sent between processes. It is why use WM_COPYDATA is recommended.

Finally, remember that the message will need to be sent to the Main Frame. If it is intended for a child window ( a CView-derived class, for example ), it should be sent to the Main Frame, and then redirected in the target application.

In a private communication with a Senior Support Engineer at Microsoft, it has been noted that there is no guarantee that a process has any windows at all. It is also possible that a process has more than one window. Even if you get the correct window, it must know about and be able to handle the message being sent. A window always has a process, but a process can have zero to any number of windows, so there is no way to make a correlation between a process and a particular window.

I personally recommand a lot of care when using this method. However, this technique is working well in my projects, and I now use it for all inter-process communication. Furthermore, since I have included my code in several different projects, I have found only two problems with this code:

  1. The Process must have finished it's initialization. This can be verified with the following call made before the call to SendMessage :
    WaitForInputIdle( ProcessInfo.hProcess, INFINITE );
  2. The Process must be receiving its messages. In order to go around this problem, I place my calls to SendMessageToProcess in a while loop, which waits to the receiving application to send back a WM_COPYDATA message confirming reception.

To add a function that send a message to a Process, perfoms the steps listed bellow. NOTE: These steps assume that the name of the CWinApp-derived object is CMyWinApp.

  1. Add the Following members to the declaration of CMyWinApp in MYWINAPP.H:
    public:
    	void SendMessageToProcess(LPPROCESS_INFORMATION lpProcessInformation, 
    	                          UINT Msg, WPARAM wParam, LPARAM lParam);
    protected:
    	static BOOL CALLBACK EnumWindowCallBack(HWND hwnd, LPARAM lParam);
  2. Define the CMyWinApp::SendMessageToProcess function.
    void CMyWinApp:: SendMessageToProcess(LPPROCESS_INFORMATION lpProcessInformation, 
                                          UINT Msg, WPARAM wParam, LPARAM lParam)
    {
    	FINDWINDOWHANDLESTRUCT fwhs;
    	fwhs.ProcessInfo = lpProcessInformation;
    	fwhs.hWndFound  = NULL;
    
    	EnumWindows ( EnumWindowCallBack, (LPARAM)&fwhs ) ;
    
    	SendMessage ( fwhs.hWndFound, Msg, wParam, lParam );
    }
  3. Define the CMyWinApp::EnumWindowCallBack function.
    BOOL CALLBACK CMyWinApp::EnumWindowCallBack(HWND hwnd, LPARAM lParam) 
    { 
    	FINDWINDOWHANDLESTRUCT * pfwhs = (FINDWINDOWHANDLESTRUCT * )lParam; 
    	DWORD ProcessId; 
    	CString Title; 
    	GetWindowThreadProcessId ( hwnd, &ProcessId ); 
    
    	// note: In order to make sure we have the MainFrame, verify that the title 
    	// has Zero-Length. Under Windows 98, sometimes the Client Window ( which doesn't 
    	// have a title ) is enumerated before the MainFrame 
    
    	CWnd::FromHandle( hwnd )->GetWindowText(Title);
    	if ( ProcessId  == pfwhs->ProcessInfo->dwProcessId && Title.GetLength() != 0) 
    	{ 
    		pfwhs->hWndFound = hwnd; 
    		return false; 
    	} 
    	else 
    	{ 
    		// Keep enumerating 
    		return true; 
    	} 
    }

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here


Written By
Web Developer
Canada Canada
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions

 
GeneralMy vote of 1 Pin
Ravindran Shanmugam12-Jul-10 8:36
Ravindran Shanmugam12-Jul-10 8:36 
Generalmight help: similar business solution Pin
Symfund10-Oct-09 14:34
Symfund10-Oct-09 14:34 
Questionblock messages from other applications ?? [modified] Pin
kob-kob24-May-09 6:06
kob-kob24-May-09 6:06 
QuestionHow HWND_BROADCAST Works? Pin
Esonix22-Feb-07 0:56
Esonix22-Feb-07 0:56 
Hi Can u tell me how HWND_BROADCAST works?I want to pass information to all system processes that now i'm writing in standard ENGLIST(U.S) language.It possible then help me.

Md. Mostafijur Rahman

GeneralFacing problem while getting Handle of an Application Pin
Raj241128-Mar-06 23:06
Raj241128-Mar-06 23:06 
GeneralRe: Facing problem while getting Handle of an Application Pin
tor sen3-Apr-06 22:30
tor sen3-Apr-06 22:30 
GeneralRe: Facing problem while getting Handle of an Application Pin
Raj24114-Apr-06 0:41
Raj24114-Apr-06 0:41 
GeneralThank you Pin
tsurutsuru18-Apr-05 6:14
tsurutsuru18-Apr-05 6:14 
Questionhow to use it Pin
roel the reds2-Nov-04 20:16
roel the reds2-Nov-04 20:16 
GeneralGive me some example of inter process communication using call back function Pin
umer shabbir25-Aug-04 20:22
umer shabbir25-Aug-04 20:22 
GeneralSend message to another application Pin
xenia2724-Dec-03 21:40
xenia2724-Dec-03 21:40 
GeneralSending Message to MessageBox Pin
Ahmer Syed9-Dec-03 18:53
Ahmer Syed9-Dec-03 18:53 
QuestionHow to find window? Pin
darwinw18-Nov-03 8:24
darwinw18-Nov-03 8:24 
AnswerRe: How to find window? Pin
crouchie0430-Apr-04 13:01
crouchie0430-Apr-04 13:01 
GeneralPassing instruction to the createprocess command prompt Pin
vgandhi13-Aug-03 13:48
vgandhi13-Aug-03 13:48 
Generalconfused Pin
ratass200210-Feb-03 19:07
ratass200210-Feb-03 19:07 
Generalgive me an example Pin
ratass200210-Feb-03 19:00
ratass200210-Feb-03 19:00 
Generalgetguithreadmessage() Pin
8-Jul-02 11:21
suss8-Jul-02 11:21 
GeneralWindow event listener Pin
11-Jun-02 2:37
suss11-Jun-02 2:37 
GeneralRe: Window event listener Pin
Silent Mobius7-Jun-04 0:05
Silent Mobius7-Jun-04 0:05 
Questionhow to set window to foregroun in win2k Pin
jodon24-Dec-01 18:19
jodon24-Dec-01 18:19 
QuestionHow to send VK_? message? Pin
16-Oct-01 15:06
suss16-Oct-01 15:06 
AnswerRe: How to send VK_? message? Pin
17-Oct-01 8:39
suss17-Oct-01 8:39 
AnswerRe: How to send VK_? message? Pin
Tim Smith17-Oct-01 9:15
Tim Smith17-Oct-01 9:15 
AnswerRe: How to send VK_? message? Pin
Navin17-Oct-01 9:19
Navin17-Oct-01 9:19 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.