网上关于使用sdk在进程间传递信息的文章,在google和百度中搜了一天,都没搜到,全是vc或者.net的,郁闷,没办法,自己写了个发送方和接收方的自己来测试一下,相关代码和注释如下:

 

发送方代码:

#include <windows.h>
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevlinstance,LPSTR szCmdLine,int iCmdShow)
{
 char szBuffer[100];
    int number=100;

    char szStart[]="Press OK to start SendMessage";
 char szText[]="Text send to other windows";


 HWND hWnd=FindWindow("MyClass",NULL);
 //如果没有找到,则:
 if(hWnd==0)
 {
  MessageBox(NULL,TEXT("Hello,Windows 98!"),TEXT("格式化字符串"),0);
 }    
 //如果找到了句柄,则:
 else
 {
  wsprintf(szBuffer,"%s",szStart,szText);
        MessageBox(NULL,szBuffer,TEXT("SendMessage"),MB_OK);
  SendMessage(hWnd,WM_SETTEXT,0,(LPARAM)szText);
 }
}

接收方代码:

 

#include <windows.h>
/* 导入包含文件WINDOWS.H,此文件包含了其它的Windows头文件                */
/* WINDEF.H   基本类型定义                                              */
/* WINNT.H    支持Unicode的类型定义                                     */
/* WINBASE.H  内核函数                                                  */
/* WINUSER.H  用户接口函数                                              */
/* WINGDI.H   图形设备接口函数 */

/************************************************************************/
/* 窗口对象的过程处理函数                                               */
/* LRESULT: 简单定义为LONG(long)                                       */
/* CALLBACK:__stdcall,指在Windows本身和用户的应用程序之间发生的函数调 */
/*           用的特殊调用序列。                                         */
/* HWND:    窗口句柄,32位数字,该参数为接受消息的窗口的句柄,          */
/*           CreateWindow函数的返回值。                                 */
/* UINT:    unsigned int 无符号整型32位,                              */
/*           该参数为MSG结构中的message域相同,表示该消息的数字         */
/* WPARAM:  UINT,32位消息参数                                         */
/* LPARAM:  LONG,32位消息参数                                         */
/************************************************************************/
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
HINSTANCE   hInst; //   当前实例
 TCHAR szBuffer[100];
 #define   IDC_BUTTON     40000

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, PSTR lpszCmdLine, int iCmdShow)
{
 /* 定义窗口类                                                           */
 /* TCHAR:char                                                          */
 /* _T和TEXT宏,功能一致,通常没用,在Unicode系统中,                    */
 /* 自动把后面的字符串转换为宽字符串                                     */
 /************************************************************************/
 TCHAR tcClassName[] = TEXT("MyClass");  //窗口类名字符串

 //char szBuffer[100];
 hInst=hInstance;

 /************************************************************************/
 /* WNDCLASS:窗口类结构,定义了窗口的一般特性,可以创建不同的窗口       */
 /* typedef struct                                                       */
 /* {                                                                    */
 /*      UINT        style ;                                             */
 /*      WNDPROC     lpfnWndProc ;                                       */
 /*      int         cbClsExtra ;                                        */
 /*      int         cbWndExtra ;                                        */
 /*      HINSTANCE   hInstance ;                                         */
 /*      HICON       hIcon ;                                             */
 /*      HCURSOR     hCursor ;                                           */
 /*      HBRUSH      hbrBackground ;                                     */
 /*      LPCTSTR     lpszMenuName ;                                      */
 /*      LPCTSTR     lpszClassName ;                                     */
 /* }                                                                    */
 /* WNDCLASS, * PWNDCLASS ;                                              */
 /************************************************************************/

 HWND hWnd;
 MSG msg;

 WNDCLASS wc;                      //窗口类属性描述结构
 wc.lpszClassName = tcClassName;   //窗口类名
 wc.lpszMenuName  = NULL;          //窗口类菜单资源名
 wc.lpfnWndProc   = WndProc;       //窗口对象的过程处理函数,指向函数的指针
 wc.hInstance     = hInstance;     //当前进程对象句柄,接收于WinMain参数
 wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); //窗口背景刷子对象
 wc.hIcon         = LoadIcon(NULL, IDI_APPLICATION);     //图标对象
 wc.hCursor       = LoadCursor(NULL, IDC_ARROW);         //光标对象
 wc.cbClsExtra    = 0;             //同类窗口对象公共数据区大小
    wc.cbWndExtra    = 0;             //当前窗口对象私有数据区大小
    wc.style         = CS_HREDRAW | CS_VREDRAW; //窗口类风格,水平或垂直尺寸改变后刷新

    if (!RegisterClass(&wc))          //注册窗口类,参数为指向WNDCLASS结构的指针
 {
  /************************************************************************/
  /* 窗口类注册不成功的错误信息                                           */
  /* MessageBox 消息框                                                    */
  /* 参数一:窗口句柄,如果没有则为NULL                                   */
  /* 参数二:消息框主体显示的字符串                                       */
  /* 参数三:消息框标题栏上的字符串                                       */
  /* 参数四:winuser.h中定义的MB_开始的常数组合,消息框风格:按钮,图标    */
  /*      为0,则只有ok按钮                                            */
  /* 返回值:返回IDOK(1)。                                                */
  /* 还可以返回IDYES、IDNO、IDCANCEL、IDABORT、IDRETRY、IDIGNORE等        */
  /************************************************************************/
  MessageBox(NULL, TEXT("RegisterClassError!"), TEXT("Error"), MB_ICONERROR);

  return 0;                        //如果注册失败,返回并终止程序
 }

 /************************************************************************/
 /* 定义窗口对象属性,指定有关窗口的更详细信息                           */
 /************************************************************************/
 TCHAR tcWindowCaptionName[] = TEXT("Win32 API"); //窗口对象标题名称
 CREATESTRUCT cs;                  //窗口对象属性描述结构,定义在WINUSER.H

 cs.lpszClass      = tcClassName;  //窗口类名
 cs.lpszName       = tcWindowCaptionName; //窗口对象标题名称,显示在标题栏
 cs.style          = WS_OVERLAPPEDWINDOW; //窗口对象风格
 cs.x              = 100;          //窗口对象在屏幕上的x坐标
 cs.y              = 100;          //窗口对象在屏幕上的y坐标
 cs.cx             = 400;          //窗口对象的宽度
 cs.cy             = 300;          //窗口对象的高度
 cs.hwndParent     = NULL;         //窗口对象的父窗口句柄
 cs.hMenu          = NULL;         //窗口对象的菜单句柄或子窗口编号
 cs.hInstance      = hInstance;    //当前进程的实例句柄,WinMain参数
 cs.lpCreateParams = NULL;         //创建参数指针,可以访问以后想要引用的程序中的数据

 /************************************************************************/
 /* 创建窗口对象                                                         */
 /* 定义窗口句柄hWnd,值为CreateWindows函数的返回值。                    */
 /* 即创建成功返回窗口的句柄,否则返回NULL                               */
 /************************************************************************/
 hWnd = CreateWindow(cs.lpszClass,
      cs.lpszName,
      cs.style,
      cs.x,
      cs.y,
      cs.cx,
   cs.cy,
      cs.hwndParent,
      cs.hMenu,
      cs.hInstance,
      cs.lpCreateParams);

 if (hWnd == NULL)    //判断创建是否成功
 {

  /************************************************************************/
  /* 窗口对象创建不成功的错误提示                                         */
  /************************************************************************/
  MessageBox(NULL, TEXT("CreateWindowError!"), TEXT("Error!"),MB_ICONERROR);

  return 0;
 }

 /************************************************************************/
 /* 显示窗口对象                                                         */
 /* 此时Windows内部已经创建了这个窗口。已经分配内存。                    */
 /* 但是要显示在显示器上还需要调用两个函数。                             */
 /* ShowWindows(hwnd,iCmdShow)                                           */
 /* 第一个参数是刚刚用CreateWindow创建的窗口的句柄。                     */
 /* 第二个参数是传给WinMain的iCmdShow。用来确定最初如何在屏幕上显示窗口。*/
 /* 也可以自定义选择以选项:                                             */
 /* SW_SHOWNORMAL      //常规                                            */
 /* SW_SHOWMAXIMIZED   //最大化                                          */
 /* SW_SHOWMINNOACTIVE //只显示在任务栏                                  */
 /* UpdateWindow(hWnd)                                                   */
 /* 导致客户区域被绘制。通过给窗口过程(Wndproc)发送一个WM_PAINT消息实现  */
 /************************************************************************/
 ShowWindow(hWnd, iCmdShow);
 UpdateWindow(hWnd);//立即刷新窗口对象
/************************************************************************/
 /* 消息检索,消息循环                                                   */
 /* MSG:消息结构,被定义在WINUSER.H                                     */
 /* 消息循环以GetMessage调用开始,它从消息队列中取出一个消息             */
 /* 这一调用传递给Windows一个指向msg的MSG结构指针。                      */
 /* 第二、三、四个参数为NULL或者0表示程序接收自己创建的所有窗口的所有消息*/
 /* Windows用从消息队列中取出的下一个消息填充msg结构的各个域             */
 /* MSG:消息结构:                                                      */
 /* typedef struct tagMSG                                                */
 /* {                                                                    */
 /*   HWND   hwnd ;    //消息发向的窗口的句柄。                          */
 /*   UINT   message ; //消息标识符,一个数值,定义在Window头文件中      */
 /*   WPARAM wParam ;  //一个32位的消息参数,含义根据消息不同而不同      */
 /*   LPARAM lParam ;  //同上                                            */
/*   DWORD  time ;    //消息放入消息队列时的时间                        */
 /*   POINT  pt ;      //消息放入消息队列时的鼠标坐标                    */
 /* }                                                                    */
 /* MSG, * PMSG ;      //结构名                                          */
 /************************************************************************/
 while (GetMessage(&msg, NULL, 0, 0))
 {

  /************************************************************************/
  /* 检索消息;当检索到WM_QUIT(其值为0x0012)消息时,从消息循环中退出      */
  /************************************************************************/
  TranslateMessage(&msg);//将msg结构传递给Windows,进行虚拟键盘消息的转换
  DispatchMessage(&msg); //发送消息,由此操作系统调用相应的窗口过程处理消息
 }

 /************************************************************************/
 /* 主窗口返回                                                           */
 /************************************************************************/
 return msg.wParam;
 }

/************************************************************************/
/* 窗口对象的过程处理函数                                               */
/* 四个参数与MSG结构中的前四个参数相同。                                */
/* 程序通常不直接调用窗口过程,由Windows本身调用。                      */
/* 程序可以通过SendMessage函数调用自己的窗口过程                        */
/************************************************************************/
LRESULT CALLBACK WndProc(HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
{

 /************************************************************************/
 /* 对消息进行分类处理                                                   */
 /* WINUSER.H为每个消息定义以WM为前缀的标识符                            */
 /*一般Windows程序元用switch和case结构来处理,此时必须返回0。            */
 /*窗口过程不处理的其它消息必须传递给DefWindowProc函数,                 */
 /*窗口过程返回该函数返回值                                              */
 /************************************************************************/
 switch (iMsg)
 {

  /************************************************************************/
  /* 客户区的绘制消息,窗口客户区域无效时刷新                             */
  /************************************************************************/
  case WM_PAINT:
  {

   /************************************************************************/
   /* PAINTSTRUCT:绘图结构,定义在WINUSER.H中                             */
   /* RECT:矩形结构                                                       */
   /* HDC:设备描述表句柄                                                  */
   /************************************************************************/
   PAINTSTRUCT ps;
   HDC hDC;
   RECT rect;
   /* 对于WM_PAINT的处理几乎总是从一个BeginPaint函数开始的:               */
   /* hDC = BeginPaint(hWnd, &ps)                                          */
   /* 而已一个EndPaint函数结束                                             */
   /* EndPaint(hWnd, &ps)                                                  */
   /* 两个调用中第一个参数是程序的窗口句柄,                               */
   /* 第二个参数是指向类型为PAINTSTRUCT的结构指针                          */
   /************************************************************************/
   hDC = BeginPaint(hWnd, &ps);       //获取显示设备对象及绘制描述属性
   GetClientRect(hWnd, &rect);        //获取当前窗口对象客户区矩形
   SetBkMode(hDC,OPAQUE);        //设置背景方式
   SetTextColor(hDC, RGB(255, 0, 255)); //设置文本颜色

   /************************************************************************/
   /* 绘制文本                                                             */
   /* DrawText函数,第一个参数是从BeginPaint返回的设备描述表句柄           */
   /* 第二个参数是要输出的文本                                             */
   /* 第三个参数是-1,表示文本串是以字节0终结的。                          */
   /* 第四个参数要绘制的矩形区域                                           */
   /* 最后一个参数是系列标志位,定义在WINDUSER.H中,水平、垂直中央,单行   */
   /************************************************************************/
   DrawText(hDC, TEXT("Hello, Win32!"), -1, &rect, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
   EndPaint(hWnd, &ps);               //客户区绘制结束,归还显示设备对象
   return 0;
  }

  case WM_CREATE:
   {
   CreateWindow(TEXT("BUTTON"),TEXT("按钮(&A)"),WS_CHILD | WS_VISIBLE |BS_PUSHBUTTON,10,10,65,22,hWnd,(HMENU)1000,hInst,NULL);
   ////////////////////////////////////////////////////////////////////
        ///下面一个是编辑框按钮,你可以在其中输入文字,具有一个简单的写字板的
       ///功能,可以复制、粘贴、剪切等操作
       ///////////////////////////////////////////////////////////////////
       CreateWindow(
       "edit",    //在这里设置此按钮为edit类型,表示将控件设定为编辑框控件
       "试试",      //字符型数组在前面已经定义,在这里显示它的内容
      WS_CHILD | WS_VISIBLE,
       10,
       160,
       568,
       130,
       hWnd,
       (HMENU)1001,
       hInst,
       NULL);
    
       return 0;
   }

  case WM_SETTEXT:
   {
    wsprintf(szBuffer,"%s",lParam,lParam);
    MessageBox(NULL,szBuffer,TEXT("格式化字符串"),0);
   // MessageBox(NULL, TEXT("RegisterClassError!"), TEXT("Error"), MB_ICONERROR);
   }


  case WM_DESTROY:                    //接收到WM_DEFTROY消息
  {

   /************************************************************************/
   /* 发送WM_QUIT消息,通知线程消息检索循环,清除窗口主程序可以退出        */
   /* PostQuitMessage(0)函数在消息队列里插入一个WM_QUIT消息                */
   /************************************************************************/
   PostQuitMessage(0);

   return 0;
  }
 }

 /************************************************************************/
 /* 程序末处理的消息交给window系统的缺省窗口对象的过程处理函数处理       */
 /************************************************************************/
 return DefWindowProc(hWnd, iMsg, wParam,lParam);
}

 

posted on 2009-04-25 19:28  jasonM  阅读(505)  评论(0编辑  收藏  举报