在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相比较,相等说明是当前进程对应窗口激活
可以响应.否则就不响应
展开
 我来答
救赎削肾客
2009-12-19 · TA获得超过1186个赞
知道大有可为答主
回答量:1196
采纳率:0%
帮助的人:949万
展开全部
这样啊。你先判断当前的活动窗口是否是记事本啊。不是的话就不响应就行了。
gift925
2009-12-19 · TA获得超过557个赞
知道小有建树答主
回答量:659
采纳率:0%
帮助的人:503万
展开全部
楼上比较聪明。呵呵。

你注册键盘钩子的时侯,搞成局部的应该可以吧。很久没搞这个,生疏了。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式