我想实现这样一个功能:
用一个键来控制我的对话框中的一个数据的值,我用了全局的键盘钩子挂好后,我在的对话框中设置了一个TIMER来动态查找我用按键改变了的哪个变量.程序成了,
但是在最后出了问题
我在我的对话框为当前窗口时可以用正常使用
但是在我的对话框不是当前窗口时,我怎么按也不起作用了,怎么回事呀请大家帮帮我
用一个键来控制我的对话框中的一个数据的值,我用了全局的键盘钩子挂好后,我在的对话框中设置了一个TIMER来动态查找我用按键改变了的哪个变量.程序成了,
但是在最后出了问题
我在我的对话框为当前窗口时可以用正常使用
但是在我的对话框不是当前窗口时,我怎么按也不起作用了,怎么回事呀请大家帮帮我
DLL 源码如下
#include "stdafx.h"
#include "autohook.h"
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
hInstance=(HINSTANCE)hModule;
return TRUE;
}LRESULT CALLBACK HookProc(int nCode,WPARAM wParam,LPARAM lParam)
{
if(nCode>=0)
if(lParam&0x80000000)
{
switch(wParam)
{
case VK_ADD:
if(!autopause)
autopause=1;
else
autopause=0;
break;
case VK_SUBTRACT:
if(!autoscroll)
autoscroll=1;
else
autoscroll=0;
break;
}
}
return CallNextHookEx(hhkHook,nCode,wParam,lParam);
}
BOOL install()
{
hhkHook=::SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)HookProc,hInstance,0);
return 1;
}
BOOL uninstall()
{
UnhookWindowsHookEx(hhkHook);
return 1;
}
BOOL returnpause()
{
return autopause;
}
BOOL returnscroll()
{
return autoscroll;
}
-----------------------
然后有几个输出函数:returnscroll() , returnpause(), install(),uninstall()--------
我在主程序中调用了intall()来安装了全局键盘钩子.
--------------
我在对话框中的ON_timer 中调用了returnscroll,and ,returnpause 这两个函数来改变对话框中的变量.
#pragma data_seg("shareddata")
int nNum=0;
HHOOK glMouseHook = NULL;
HINSTANCE glMouseInstance = NULL;
#pragma data_seg()static AFX_EXTENSION_MODULE KeyHookDLL = { NULL, NULL };extern "C" int APIENTRY
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
UNREFERENCED_PARAMETER(lpReserved); if (dwReason == DLL_PROCESS_ATTACH)
{ TRACE0("KEYHOOK.DLL Initializing!\n");
glMouseInstance = hInstance;
if (!AfxInitExtensionModule(KeyHookDLL, hInstance))
return 0;
new CDynLinkLibrary(KeyHookDLL);
}
else if (dwReason == DLL_PROCESS_DETACH)
{
TRACE0("KEYHOOK.DLL Terminating!\n");
// Terminate the library before destructors are called
AfxTermExtensionModule(KeyHookDLL);
}
return 1; // ok
}
LRESULT WINAPI KeyChangeKey(int code,WPARAM wParam,LPARAM lParam)
{
if(code < 0)
return CallNextHookEx(glMouseHook,code,wParam,lParam);
else
{
if(GetAsyncKeyState(VK_SHIFT) < 0)
MessageBox(NULL,_T("Enter SHIFT"),"",MB_OK);
nNum++;
if(nNum == 50)
{
UnhookWindowsHookEx(glMouseHook);
glMouseHook = NULL;
return S_OK;
}
}
return CallNextHookEx(glMouseHook,code,wParam,lParam);
}extern "C" _declspec(dllexport) void WINAPI ExternKeyToGetKey(void)
{
glMouseHook = SetWindowsHookEx(WH_KEYBOARD,KeyChangeKey,glMouseInstance,0);
}extern "C" _declspec(dllexport) void WINAPI StopKeyHook(void)
{
UnhookWindowsHookEx(glMouseHook);
}
他能在多个process里面公用吗
注意你要在多个process里面共享资源,你可以试试::SetWindowtText(hwnd,....)
但是要用动态连接 MFC