Activating the First Instance with the Command Line, Source

/*
   1inst.cpp

   Demostrates the use of global atoms and registered messages to pass
   command line information to a single application instance.

   01 April 1997 by Rich Goldstein, MD
*/



#include <owl\pch.h>
#pragma hdrstop


const char *szUniqueAppString = "TestOneInstance";
UINT WM_MY_ACTIVATEAPP = 
0;

class TMyMainWindow : public TDecoratedMDIFrame
{
   
public:
      TMyMainWindow(
const char* title, TResId menuResId, TMDIClient& clientWnd,
                    
bool track, TModule* module = 0) :
         TDecoratedMDIFrame(title, menuResId, clientWnd, track, module)
         {}

      
void SetupWindow()
      {
         TDecoratedMDIFrame::SetupWindow();
         
// Add our unique property
         ::SetProp(GetHandle(), szUniqueAppString, (HANDLE)
1);   // value must not be zero
      }

      
// This method is responsible for our activation
      LRESULT EvNewInstance(WPARAM atom, LPARAM);

   DECLARE_RESPONSE_TABLE(TMyMainWindow);
};

DEFINE_RESPONSE_TABLE1(TMyMainWindow, TDecoratedMDIFrame)
   EV_REGISTERED(szUniqueAppString, EvNewInstance),
END_RESPONSE_TABLE;


LRESULT TMyMainWindow::EvNewInstance(WPARAM atom, LPARAM)
{
   
char buff[256];

   
if (::GlobalGetAtomName(atom, buff, 256))
   {
      
// free up the atom space
      ::GlobalDeleteAtom(atom);
      
// Process the command line!
      TMDIClient* client = GetClientWindow();
      
if (client)
      {
         
if (::IsIconic(GetHandle()))
            ::SendMessage(GetHandle(), WM_SYSCOMMAND, SC_RESTORE, 
0); 
         
#ifdef __WIN32__
         ::SetForegroundWindow(GetHandle());
         
#else
         ::BringWindowToTop(GetHandle());
         
#endif
         TMDIChild* child = 
new TMDIChild(*client, buff);
         child->Create();
         ::PostMessage(client->GetHandle(), WM_MDIACTIVATE, (WPARAM)child->GetHandle(), 
0);
      }
   }
   
return 0;
}

class TTestApp : public TApplication
{
   
public:
      TTestApp() :
         TApplication(
"OneInstance")
      {}

      
void InitMainWindow()
      {
         SetMainWindow(
new TMyMainWindow("OneInstance"0, *new TMDIClient, false));
      }
};

int OwlMain (int , char* argv[])
{
   TTestApp app;

   WM_MY_ACTIVATEAPP = ::RegisterWindowMessage(szUniqueAppString);

   HWND desktop = ::GetDesktopWindow();
   HWND child= ::GetWindow(desktop, GW_CHILD);

   
while (child)
   {
      
if (::GetProp(child, szUniqueAppString))
      {
         
// found a window with the property
         
// store the current command line as an atom...
         ATOM atom = GlobalAddAtom(app.GetCmdLine().c_str());
         
// send the message to the currently running app
         ::SendMessage(child, WM_MY_ACTIVATEAPP, atom, 
0);
         
// don't let this instance continue now
         
return 0;
      }
      child = ::GetWindow(child, GW_HWNDNEXT);
   }
   
// No prior instance found, so proceed.
   
return app.Run();
}