在MFC dll中创建的键盘消息线程的问题
在MFCdll中创建的键盘消息线程为什么是全局的?也就是说不管你当前是什么窗口得到焦点,你按热键都会响应.那怎么才能使只有加载了该dll的窗口得到焦点时才响应这个热键呢?...
在MFC dll中创建的键盘消息线程为什么是全局的?也就是说不管你当前是什么窗口得到焦点,你按热键都会响应.
那怎么才能使只有加载了该dll的窗口得到焦点时才响应这个热键呢?
以下的我的代码:
在MFC dll 工程中的
BOOL CInjectApp::InitInstance()
{
// TODO: 在此添加专用代码和/或调用基类
::CreateThread(NULL, 0, WorkThread, NULL, 0, NULL);
return CWinApp::InitInstance();
}
相关线程函数:
DWORD WINAPI UIThread(LPVOID p)
{
if (dlg==NULL)
{
dlg=new CInjectDlg;
dlg->Create(IDD_INJECT_DLG);
dlg->ShowWindow(SW_SHOW);
//
}
MSG msg;
while (GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
CloseHandle(g_hUIThread);
g_hUIThread=NULL;
return 0;
}
DWORD WINAPI WorkThread(LPVOID p)
{
g_hUIThread=CreateThread(NULL, 0, UIThread, NULL, 0, NULL);
while ( WaitForSingleObject(g_hUIThread, 100) == WAIT_TIMEOUT )
{
if ( GetAsyncKeyState(VK_HOME) < 0 )
{
if ( dlg == NULL )
{
if ( g_hUIThread == NULL )
g_hUIThread = CreateThread(NULL, 0, UIThread, NULL, 0, NULL);
}
else
{
//dlg->ShowWindow(dlg->IsWindowVisible() ? SW_HIDE : SW_RESTORE);
dlg->ShowWindow(SW_RESTORE);
}
Beep(1400, 100);
}
if ( GetAsyncKeyState(VK_END) < 0 )
{
}
}
CloseHandle(g_hThread);
g_hThread = NULL;
return 0;
}
用以上方法就会得到一个全局响应的键盘消息.但是我只想要个局部的.
举个例子吧:
比如我用远程注入方式把一个dll注入到了一个 记事本 中,我想只有当我切换到 记事本 时,按home键才呼出一个窗口.而不是切换到任意窗口都能按home键呼出一个窗口.
用键盘钩子是没有问题的,但是我想要的不是用键盘钩子.
问题已由wdlqlb提供的思路解决(虽然不是我想要的答案)
解决方法如下:
在上的面WorkThread中加入以下代码:
hWnd=GetForegroundWindow();//得到当前激活的窗口句柄
GetWindowThreadProcessId(hWnd,&ProcID);//得到当前激活窗口对应的进程ID
if(ProcID==GetCurrentProcessId())//与执行这个函数的进程的ID相比较,相等说明是当前进程对应窗口激活
可以响应.否则就不响应 展开
那怎么才能使只有加载了该dll的窗口得到焦点时才响应这个热键呢?
以下的我的代码:
在MFC dll 工程中的
BOOL CInjectApp::InitInstance()
{
// TODO: 在此添加专用代码和/或调用基类
::CreateThread(NULL, 0, WorkThread, NULL, 0, NULL);
return CWinApp::InitInstance();
}
相关线程函数:
DWORD WINAPI UIThread(LPVOID p)
{
if (dlg==NULL)
{
dlg=new CInjectDlg;
dlg->Create(IDD_INJECT_DLG);
dlg->ShowWindow(SW_SHOW);
//
}
MSG msg;
while (GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
CloseHandle(g_hUIThread);
g_hUIThread=NULL;
return 0;
}
DWORD WINAPI WorkThread(LPVOID p)
{
g_hUIThread=CreateThread(NULL, 0, UIThread, NULL, 0, NULL);
while ( WaitForSingleObject(g_hUIThread, 100) == WAIT_TIMEOUT )
{
if ( GetAsyncKeyState(VK_HOME) < 0 )
{
if ( dlg == NULL )
{
if ( g_hUIThread == NULL )
g_hUIThread = CreateThread(NULL, 0, UIThread, NULL, 0, NULL);
}
else
{
//dlg->ShowWindow(dlg->IsWindowVisible() ? SW_HIDE : SW_RESTORE);
dlg->ShowWindow(SW_RESTORE);
}
Beep(1400, 100);
}
if ( GetAsyncKeyState(VK_END) < 0 )
{
}
}
CloseHandle(g_hThread);
g_hThread = NULL;
return 0;
}
用以上方法就会得到一个全局响应的键盘消息.但是我只想要个局部的.
举个例子吧:
比如我用远程注入方式把一个dll注入到了一个 记事本 中,我想只有当我切换到 记事本 时,按home键才呼出一个窗口.而不是切换到任意窗口都能按home键呼出一个窗口.
用键盘钩子是没有问题的,但是我想要的不是用键盘钩子.
问题已由wdlqlb提供的思路解决(虽然不是我想要的答案)
解决方法如下:
在上的面WorkThread中加入以下代码:
hWnd=GetForegroundWindow();//得到当前激活的窗口句柄
GetWindowThreadProcessId(hWnd,&ProcID);//得到当前激活窗口对应的进程ID
if(ProcID==GetCurrentProcessId())//与执行这个函数的进程的ID相比较,相等说明是当前进程对应窗口激活
可以响应.否则就不响应 展开
2个回答
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询