Chinaunix首页 | 论坛 | 博客
  • 博客访问: 202142
  • 博文数量: 11
  • 博客积分: 4010
  • 博客等级: 上校
  • 技术积分: 160
  • 用 户 组: 普通用户
  • 注册时间: 2006-07-03 14:24
个人简介

从客服技术支持到程序开发 从传统电信行业到互联网,以及移动互联网 岁月流逝,梦想依旧 个人订阅号--licaduo

文章分类

全部博文(11)

文章存档

2010年(11)

我的朋友

分类: C/C++

2010-06-22 22:26:48

     在我们的应用中有2个进程,一个进程用键盘钩子截获键盘消息,当截获到指定的键盘消息后像另外一个进程的窗口发送一个特定的键盘消息。于是这中间涉及到了进程间的消息发送。
    下面是一个示例代码
     //根据应用程序名查找到应用程序的窗口句柄
DWORD g_processID;   //进程句柄
DWORD g_ThreadID;    //线程句柄
CRITICAL_SECTION g_hCritical;  //windows 锁句柄(确切的应该叫关键代码段)
bool IsExsit(CString strExeFile)
{
   //加锁
 ::EnterCriticalSection(&g_hCritical);
    CString strFileName;
    bool bFound = false;
 
    PROCESSENTRY32 pe32 = {sizeof(pe32)};
    HANDLE hSnapShot = NULL;
   //系统内进行进程快照
 hSnapShot = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS|TH32CS_SNAPNOHEAPS, 0);
    if (hSnapShot == INVALID_HANDLE_VALUE)
 {
  //如果快照失败,释放锁
  ::LeaveCriticalSection(&g_hCritical);
        return bFound;
 }
    //遍历这些快照后的结果,直到找到我们需要的进程,如果没有找到就返回失败
    BOOL bFlag = ::Process32First(hSnapShot, &pe32);
    while (bFlag)
    {
        strFileName = CString(pe32.szExeFile);
  if (strFileName==strExeFile)
        {
            bFound = true;
   g_processID = pe32.th32ProcessID;   
            break;
        }
        bFlag = ::Process32Next(hSnapShot, &pe32);
    }
    //关闭系统快照
    ::CloseToolhelp32Snapshot(hSnapShot);
//释放锁 
::LeaveCriticalSection(&g_hCritical);
 return bFound;
}
     //首先查看该进程是否存在,同时找到该进程的进程id
    if(IsExsit(_T("myapp")))
{
     HWND hwnd=::FindWindow(NULL,_T("myapp"));
    if (hwnd)
    {
         //根据句柄查找到该窗口对应的线程
         g_ThreadID = GetWindowThreadProcessId(hwnd,&g_processID); 
         //发送消息
         ::PostThreadMessage(g_ThreadID,WM_KEYUP,13,13);
    }
}
     
 
阅读(10535) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~