在我们的应用中有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);
}
}
阅读(10555) | 评论(0) | 转发(0) |