键盘监听出现问题 急。。。。在线等

xierangh 2010-01-29 04:48:28
我写一个c++的dll程序来监听是否有键盘和鼠标的输入(只要有键盘键入或者鼠标移动就把打印成为true,否则为false)
我测试了下 发现程序运行一段时间后,就不能判断鼠标和键盘有输入了(表现为打印全0)

我的代码如下
这是主程序:

#if defined(WIN32)
#include "windows.h"
#include "time.h"
#include "stdio.h"
#elif defined(SOLARIS)
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <sys/time.h>
#elif defined(LINUX)
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <sys/time.h>
#endif


#pragma data_seg("data")
HINSTANCE g_hinstDLL = NULL; // 模块实例句柄

HHOOK g_hKeyboardHook = NULL; // 键盘钩子句柄
HHOOK g_hMouseHook = NULL; // 鼠标钩子句柄

BOOL g_KeyboardState = FALSE; // 键盘钩子的状态
BOOL g_MouseState = FALSE; // 鼠标钩子的状态

int count = 0;
int nCode = 0;//
#pragma data_seg()
#pragma comment(linker, "/SECTION:data,RWS")


//键盘钩子
LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{


if(nCode == HC_ACTION)
{
g_KeyboardState = TRUE;
}

// 传给系统中的下一个钩子
return CallNextHookEx(g_hKeyboardHook,nCode,wParam,lParam);
}


//鼠标钩子
LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam, LPARAM lParam)
{
if(nCode == HC_ACTION)
{
g_MouseState = TRUE;
}

// 传给系统中的下一个钩子
return CallNextHookEx(g_hMouseHook,nCode,wParam,lParam);
}


//安装钩子
BOOL WINAPI StartHook(HWND h)
{

count++;

//如果已经安装键盘钩子则返回false
if(g_hKeyboardHook != NULL)
{
return FALSE;
}

//如果已经安装鼠标钩子则返回false
if(g_hMouseHook != NULL)
{
return FALSE;
}


//安装键盘钩子
g_hKeyboardHook = SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,g_hinstDLL,0);
if(g_hKeyboardHook == NULL)
{
return FALSE;
}


//安装鼠标钩子
g_hMouseHook = SetWindowsHookEx(WH_MOUSE,MouseProc,g_hinstDLL,0);
if(g_hMouseHook == NULL)
{
return FALSE;
}

printf("StartHook success\n");


return TRUE;
}


//卸载钩子
BOOL WINAPI StopHook()
{
// 卸载键盘钩子
if(UnhookWindowsHookEx(g_hKeyboardHook) == 0)
{
return FALSE;
}
g_hKeyboardHook = NULL;

// 鼠标键盘钩子
if(UnhookWindowsHookEx(g_hMouseHook) == 0)
{
return FALSE;
}
g_hMouseHook = NULL;

return TRUE;
}

//返回键盘钩子状态
BOOL WINAPI KeyboardState()
{
BOOL ret = g_KeyboardState;

if(g_KeyboardState == TRUE)
{
g_KeyboardState = FALSE;
}

return ret;
}

//返回鼠标钩子状态
BOOL WINAPI MouseState()
{
BOOL ret = g_MouseState;

int nCode = 0;//

if(g_MouseState == TRUE)
{
g_MouseState = FALSE;
}

return ret;
}



#include "Autolock.h"
#include "optel_com_cn_global_GetKeyAndMouseInfoAdapter.h"

extern HINSTANCE g_hinstDLL;

BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
g_hinstDLL = (HINSTANCE)hModule;
StartHook(0);
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
case DLL_PROCESS_DETACH:
StopHook();
break;
}
return TRUE;
}


/*
* Class: optel_com_cn_global_GetKeyAndMouseInfoAdapter
* Method: isKeyAndMouseMoved
* Signature: ()Z
*/
JNIEXPORT jboolean JNICALL Java_optel_com_cn_global_GetKeyAndMouseInfoAdapter_isKeyAndMouseMoved
(JNIEnv * env, jobject)
{
int ret = KeyboardState() | MouseState();

if(ret == 0)
return 0;
return 0xff; //java的false是0,true是全f.
}

JNIEXPORT int isKeyAndMouseMoved()
{
return (int)(KeyboardState() | MouseState());
}

JNIEXPORT void StartHook1()
{
StartHook(0);
}

JNIEXPORT void StopHook1()
{
// return _SendIsActive();
StopHook();
}


/*
* Class: optel_com_cn_global_GetKeyAndMouseInfoAdapter
* Method: getQuietTime
* Signature: ()I
*/
JNIEXPORT jint JNICALL Java_optel_com_cn_global_GetKeyAndMouseInfoAdapter_getQuietTime
(JNIEnv *, jobject)
{
return 0;
}


这是我的测试程序:

// AutolockTest.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "windows.h"

__declspec(dllimport) int isKeyAndMouseMoved();


int main(int argc, char* argv[])
{
int prev = -1;
int count = 0;
printf("Hello World!\n");

while(1)
{
int status = isKeyAndMouseMoved();

if(status!=prev || count >= 100)//如果状态改变了或者有100次没有改变都会打印状态的
{
fprintf(stderr, "%d\n", status);
fflush(stderr);
count = 0;
}

Sleep(10);

prev = status;
count++;
}
return 0;
}

...全文
516 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
xierangh 2010-02-01
  • 打赏
  • 举报
回复
开始运行确实是对的,但是运行一段时间过后,就会发现监听器失效了
//键盘钩子
LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{


if(nCode == HC_ACTION)
{
g_KeyboardState = TRUE;
}

// 传给系统中的下一个钩子
return CallNextHookEx(g_hKeyboardHook,nCode,wParam,lParam);
}


//鼠标钩子
LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam, LPARAM lParam)
{
if(nCode == HC_ACTION)
{
g_MouseState = TRUE;
}

// 传给系统中的下一个钩子
return CallNextHookEx(g_hMouseHook,nCode,wParam,lParam);
}

发现系统没有调用这两个函数了。还有种可能就是g_hMouseHook钩子已经不指向原来的钩子了。
flyerwing 2010-02-01
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 xierangh 的回复:]
上面没有把代码贴上
我的代码如下
这是主程序:
C/C++ code#if defined(WIN32)
#include"windows.h"
#include"time.h"
#include"stdio.h"#elif defined(SOLARIS)
#include<unistd.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<netdb.h>
#include<sys/time.h>#elif defined(LINUX)
#include<unistd.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<netdb.h>
#include<sys/time.h>#endif#pragma data_seg("data")
HINSTANCE g_hinstDLL= NULL;// 模块实例句柄
HHOOK g_hKeyboardHook= NULL;// 键盘钩子句柄HHOOK g_hMouseHook= NULL;// 鼠标钩子句柄
BOOL g_KeyboardState= FALSE;// 键盘钩子的状态BOOL g_MouseState= FALSE;// 鼠标钩子的状态int count=0;int nCode=0;//#pragma data_seg()#pragma comment(linker, "/SECTION:data,RWS")//键盘钩子LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{if(nCode== HC_ACTION)
{
g_KeyboardState= TRUE;
}// 传给系统中的下一个钩子return CallNextHookEx(g_hKeyboardHook,nCode,wParam,lParam);
}//鼠标钩子LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam, LPARAM lParam)
{if(nCode== HC_ACTION)
{
g_MouseState= TRUE;
}// 传给系统中的下一个钩子return CallNextHookEx(g_hMouseHook,nCode,wParam,lParam);
}//安装钩子BOOL WINAPI StartHook(HWND h)
{

count++;//如果已经安装键盘钩子则返回falseif(g_hKeyboardHook!= NULL)
{return FALSE;
}//如果已经安装鼠标钩子则返回falseif(g_hMouseHook!= NULL)
{return FALSE;
}//安装键盘钩子 g_hKeyboardHook= SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,g_hinstDLL,0);if(g_hKeyboardHook== NULL)
{return FALSE;
}//安装鼠标钩子 g_hMouseHook= SetWindowsHookEx(WH_MOUSE,MouseProc,g_hinstDLL,0);if(g_hMouseHook== NULL)
{return FALSE;
}

printf("StartHook success\n");return TRUE;
}//卸载钩子BOOL WINAPI StopHook()
{// 卸载键盘钩子if(UnhookWindowsHookEx(g_hKeyboardHook)==0)
{return FALSE;
}
g_hKeyboardHook= NULL;// 鼠标键盘钩子if(UnhookWindowsHookEx(g_hMouseHook)==0)
{return FALSE;
}
g_hMouseHook= NULL;return TRUE;
}//返回键盘钩子状态BOOL WINAPI KeyboardState()
{
BOOL ret= g_KeyboardState;if(g_KeyboardState== TRUE)
{
g_KeyboardState= FALSE;
}return ret;
}//返回鼠标钩子状态BOOL WINAPI MouseState()
{
BOOL ret= g_MouseState;int nCode=0;//if(g_MouseState== TRUE)
{
g_MouseState= FALSE;
}return ret;
}
C/C++ code
#include"Autolock.h"
#include"optel_com_cn_global_GetKeyAndMouseInfoAdapter.h"extern HINSTANCE g_hinstDLL;

BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{switch (ul_reason_for_call)
{case DLL_PROCESS_ATTACH:
g_hinstDLL= (HINSTANCE)hModule;
StartHook(0);break;case DLL_THREAD_ATTACH:break;case DLL_THREAD_DETACH:break;case DLL_PROCESS_DETACH:
StopHook();break;
}return TRUE;
}/*
* Class: optel_com_cn_global_GetKeyAndMouseInfoAdapter
* Method: isKeyAndMouseMoved
* Signature: ()Z*/
JNIEXPORT jboolean JNICALL Java_optel_com_cn_global_GetKeyAndMouseInfoAdapter_isKeyAndMouseMoved
(JNIEnv* env, jobject)
{int ret= KeyboardState()| MouseState();if(ret==0)return0;return0xff;//java的false是0,true是全f.}

JNIEXPORTint isKeyAndMouseMoved()
{return (int)(KeyboardState()| MouseState());
}

JNIEXPORTvoid StartHook1()
{
StartHook(0);
}

JNIEXPORTvoid StopHook1()
{// return _SendIsActive(); StopHook();
}/*
* Class: optel_com_cn_global_GetKeyAndMouseInfoAdapter
* Method: getQuietTime
* Signature: ()I*/
JNIEXPORT jint JNICALL Java_optel_com_cn_global_GetKeyAndMouseInfoAdapter_getQuietTime
(JNIEnv*, jobject)
{return0;
}
这是我的测试程序:
C/C++ code// AutolockTest.cpp : Defines the entry point for the console application.//
#include"stdafx.h"
#include"windows.h"

__declspec(dllimport)int isKeyAndMouseMoved();int main(int argc,char* argv[])
{int prev=-1;int count=0;
printf("Hello World!\n");while(1)
{int status= isKeyAndMouseMoved();if(status!=prev|| count>=100)//状态改变或者100次没有改变都会打印状态 {
fprintf(stderr,"%d\n", status);
fflush(stderr);
count=0;
}

Sleep(10);

prev= status;
count++;
}return0;
}
[/Quote]
这个应该是对的吧
怎么会不行呢?
ddyycc789 2010-02-01
  • 打赏
  • 举报
回复
代码太长
xierangh 2010-02-01
  • 打赏
  • 举报
回复
顶上去!!!
xierangh 2010-02-01
  • 打赏
  • 举报
回复
已解决。估计是因为在unhook时由于某种原因没有成功。那么下次运行时就不会安装钩子。造成系统运行一段时间过后监听器失效的假象。只要保证每次能保证安装钩子过程进行完毕,并且卸载钩子就不会造成此假象了。
xierangh 2010-02-01
  • 打赏
  • 举报
回复
顶!!!
liu217yang217 2010-01-30
  • 打赏
  • 举报
回复
up
xierangh 2010-01-30
  • 打赏
  • 举报
回复
自己在顶!!!顶起来!!
xierangh 2010-01-30
  • 打赏
  • 举报
回复
顶!不要沉了哦!
s446721902 2010-01-29
  • 打赏
  • 举报
回复
up
Jack__h 2010-01-29
  • 打赏
  • 举报
回复
友情UP MARK
xierangh 2010-01-29
  • 打赏
  • 举报
回复
实际上只需要解决dll在windows下的情况就可以了其他我自己搞定,呵呵
xierangh 2010-01-29
  • 打赏
  • 举报
回复
原本是在Java里调用这个dll的,做的Java程序要支持多平台所以就都有了
cattycat 2010-01-29
  • 打赏
  • 举报
回复
你的这个居然还有java的jni,dll,linux,windows都占全了。
友情up。
xierangh 2010-01-29
  • 打赏
  • 举报
回复
解决了就给分
xierangh 2010-01-29
  • 打赏
  • 举报
回复
我怀疑是我安装的钩子失效了,但是找不到为什么会失效,求教高手。。
xierangh 2010-01-29
  • 打赏
  • 举报
回复
代码已经贴出来了
我要戒烟了 2010-01-29
  • 打赏
  • 举报
回复
我的也要杀毒了...
clhposs 2010-01-29
  • 打赏
  • 举报
回复
不知道你的程序中是否做了鼠标键盘动了设置为false,然后多久没动又设置成true功能没有?
xierangh 2010-01-29
  • 打赏
  • 举报
回复
上面没有把代码贴上
我的代码如下
这是主程序:

#if defined(WIN32)
#include "windows.h"
#include "time.h"
#include "stdio.h"
#elif defined(SOLARIS)
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <sys/time.h>
#elif defined(LINUX)
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <sys/time.h>
#endif


#pragma data_seg("data")
HINSTANCE g_hinstDLL = NULL; // 模块实例句柄

HHOOK g_hKeyboardHook = NULL; // 键盘钩子句柄
HHOOK g_hMouseHook = NULL; // 鼠标钩子句柄

BOOL g_KeyboardState = FALSE; // 键盘钩子的状态
BOOL g_MouseState = FALSE; // 鼠标钩子的状态

int count = 0;
int nCode = 0;//
#pragma data_seg()
#pragma comment(linker, "/SECTION:data,RWS")


//键盘钩子
LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{


if(nCode == HC_ACTION)
{
g_KeyboardState = TRUE;
}

// 传给系统中的下一个钩子
return CallNextHookEx(g_hKeyboardHook,nCode,wParam,lParam);
}


//鼠标钩子
LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam, LPARAM lParam)
{
if(nCode == HC_ACTION)
{
g_MouseState = TRUE;
}

// 传给系统中的下一个钩子
return CallNextHookEx(g_hMouseHook,nCode,wParam,lParam);
}


//安装钩子
BOOL WINAPI StartHook(HWND h)
{

count++;

//如果已经安装键盘钩子则返回false
if(g_hKeyboardHook != NULL)
{
return FALSE;
}

//如果已经安装鼠标钩子则返回false
if(g_hMouseHook != NULL)
{
return FALSE;
}


//安装键盘钩子
g_hKeyboardHook = SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,g_hinstDLL,0);
if(g_hKeyboardHook == NULL)
{
return FALSE;
}


//安装鼠标钩子
g_hMouseHook = SetWindowsHookEx(WH_MOUSE,MouseProc,g_hinstDLL,0);
if(g_hMouseHook == NULL)
{
return FALSE;
}

printf("StartHook success\n");


return TRUE;
}


//卸载钩子
BOOL WINAPI StopHook()
{
// 卸载键盘钩子
if(UnhookWindowsHookEx(g_hKeyboardHook) == 0)
{
return FALSE;
}
g_hKeyboardHook = NULL;

// 鼠标键盘钩子
if(UnhookWindowsHookEx(g_hMouseHook) == 0)
{
return FALSE;
}
g_hMouseHook = NULL;

return TRUE;
}

//返回键盘钩子状态
BOOL WINAPI KeyboardState()
{
BOOL ret = g_KeyboardState;

if(g_KeyboardState == TRUE)
{
g_KeyboardState = FALSE;
}

return ret;
}

//返回鼠标钩子状态
BOOL WINAPI MouseState()
{
BOOL ret = g_MouseState;

int nCode = 0;//

if(g_MouseState == TRUE)
{
g_MouseState = FALSE;
}

return ret;
}



#include "Autolock.h"
#include "optel_com_cn_global_GetKeyAndMouseInfoAdapter.h"

extern HINSTANCE g_hinstDLL;

BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
g_hinstDLL = (HINSTANCE)hModule;
StartHook(0);
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
case DLL_PROCESS_DETACH:
StopHook();
break;
}
return TRUE;
}


/*
* Class: optel_com_cn_global_GetKeyAndMouseInfoAdapter
* Method: isKeyAndMouseMoved
* Signature: ()Z
*/
JNIEXPORT jboolean JNICALL Java_optel_com_cn_global_GetKeyAndMouseInfoAdapter_isKeyAndMouseMoved
(JNIEnv * env, jobject)
{
int ret = KeyboardState() | MouseState();

if(ret == 0)
return 0;
return 0xff; //java的false是0,true是全f.
}

JNIEXPORT int isKeyAndMouseMoved()
{
return (int)(KeyboardState() | MouseState());
}

JNIEXPORT void StartHook1()
{
StartHook(0);
}

JNIEXPORT void StopHook1()
{
// return _SendIsActive();
StopHook();
}


/*
* Class: optel_com_cn_global_GetKeyAndMouseInfoAdapter
* Method: getQuietTime
* Signature: ()I
*/
JNIEXPORT jint JNICALL Java_optel_com_cn_global_GetKeyAndMouseInfoAdapter_getQuietTime
(JNIEnv *, jobject)
{
return 0;
}


这是我的测试程序:

// AutolockTest.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "windows.h"

__declspec(dllimport) int isKeyAndMouseMoved();


int main(int argc, char* argv[])
{
int prev = -1;
int count = 0;
printf("Hello World!\n");

while(1)
{
int status = isKeyAndMouseMoved();

if(status!=prev || count >= 100)//状态改变或者100次没有改变都会打印状态
{
fprintf(stderr, "%d\n", status);
fflush(stderr);
count = 0;
}

Sleep(10);

prev = status;
count++;
}
return 0;
}


加载更多回复(1)
个Keyclone的功能是比AutoHotKey要来的强,而且更简单。所以我还是要向大家推荐,并且给大家一些简单的教程,好让大家快速上手。 首先下载破解版本免安装的,双击Keyclone.exe,进入主界面,如下: 恩,这个是我现在的配置,你第一次打开时没有192.168.1.103:1442.....这一行的,别,咱们进入setup配置下,点setup,进入下图: 进入general这一项,先在keyclone name取个标识你的keyclone的名字,我随便取了个sony. local port是在两台电脑上联机使用keyclone的端口,只要你的端口没被占用,可以随便取,建议默认的就好。 send only 我一般是不勾的,因为这个项目是在另外一台电脑和你联机时,他通过keyclone发送的按键,这里也可以收到,如果勾了的话,就不能接收别机的键盘信号了。 auto-add windows titled,这个勾了的话,就可以自动识别你的windows窗口名,并自动加入到keyclone控制栏里了,exact name match,勾上就是精确识别下面设置的名称,建议勾上。最后在下面的文本框输入你要控制的各种窗口名字,恩,相信大家都是用来多开魔兽的,所以请写上"魔兽世界",台湾的写繁体版本的魔兽世界,欧美的写world of warcraft即可。 下面的几个pass mouse clicks,镜像鼠标点击(应该是只相应鼠标点击事件) distinguish left/right(区分鼠标左键和右键,对应pass mouse clicks) focus follows mouse,不知道到底有何作用,焦点跟随鼠标?我个人没有使用这个功能 always-on-top,使keyclone软件界面总在前面,基本不用 我都没勾,因为我个人觉得暂时用不到。 startup command我没使用 auto-connect,这个要好好设置下,主要是那些像我10开或15开的疯子,在2台电脑上利用keyclone联机使用多开的时候,利用这个,可以自动的连接2台电脑。如你所见,我在里面填的是192.168.1.103:1442 192.168.1.103是我的另外一台需要连接的电脑的内网IP地址,1442是上面填写的端口号。填写好后,每次打开keyclone软件,就自动 添加了这个IP,并不停监听端口,你这个时候再打开另外一台电脑的keyclone,就会自动识别在这个主keyclone了。其实keyclone没有 所谓主和副而言,在不同电脑的keyclone都是并列的。 OK,点apply, 再点OK,这样,就基本配置好了。 你这个时候,只要打开多个魔兽世界游戏,即可,keyclone会自动识别。如下图: 然后最小化keyclone,就会自动缩小在右下角了,进入游戏吧。我保证你会有时间需要使keyclone暂停的,这时你只要把鼠标右键点击keyclone的小图标,会出现小窗口,点override即可,再点一次就是恢复正常。 keyclone默认的是把所有键盘都镜像了,所以,你应该会要让某几个键位不镜像,譬如wasd,这个如果镜像了,再游戏里,会很乱,无法跟随。于是,你要进入setup,点do-not-pass,如下图: 在那里,先点击这行字,再按你要屏蔽的键盘,这样你屏蔽的键盘都会列表在上面的表里,你可以随时增加,取消。点apply和OK,就设置好了。 最后,在双机多开的操作中,另外一台电脑上的keyclone设置和以上的一样,只要把auto-connect的IP地址改成“你的IP地址:你设置的keyclone端口”即可,就能自动识别局域网里keyclone了。 以上是最简单的设置,基本上,以上的设置,就足以使你完成多开的任务了,更多更方便的设置你可以自己研究下。
这个Keyclone的功能是比AutoHotKey要来的强,而且更简单。所以我还是要向大家推荐,并且给大家一些简单的教程,好让大家快速上手。 首先下载破解版本免安装的,双击Keyclone.exe,进入主界面,如下: 恩,这个是我现在的配置,你第一次打开时没有192.168.1.103:1442.....这一行的,别,咱们进入setup配置下,点setup,进入下图: 进入general这一项,先在keyclone name取个标识你的keyclone的名字,我随便取了个sony. local port是在两台电脑上联机使用keyclone的端口,只要你的端口没被占用,可以随便取,建议默认的就好。 send only 我一般是不勾的,因为这个项目是在另外一台电脑和你联机时,他通过keyclone发送的按键,这里也可以收到,如果勾了的话,就不能接收别机的键盘信号了。 auto-add windows titled,这个勾了的话,就可以自动识别你的windows窗口名,并自动加入到keyclone控制栏里了,exact name match,勾上就是精确识别下面设置的名称,建议勾上。最后在下面的文本框输入你要控制的各种窗口名字,恩,相信大家都是用来多开魔兽的,所以请写上"魔兽世界",台湾的写繁体版本的魔兽世界,欧美的写world of warcraft即可。 下面的几个pass mouse clicks,镜像鼠标点击(应该是只相应鼠标点击事件) distinguish left/right(区分鼠标左键和右键,对应pass mouse clicks) focus follows mouse,不知道到底有何作用,焦点跟随鼠标?我个人没有使用这个功能 always-on-top,使keyclone软件界面总在前面,基本不用 我都没勾,因为我个人觉得暂时用不到。 startup command我没使用 auto-connect,这个要好好设置下,主要是那些像我10开或15开的疯子,在2台电脑上利用keyclone联机使用多开的时候,利用这个,可以自动的连接2台电脑。如你所见,我在里面填的是192.168.1.103:1442 192.168.1.103是我的另外一台需要连接的电脑的内网IP地址,1442是上面填写的端口号。填写好后,每次打开keyclone软件,就自动 添加了这个IP,并不停监听端口,你这个时候再打开另外一台电脑的keyclone,就会自动识别在这个主keyclone了。其实keyclone没有 所谓主和副而言,在不同电脑的keyclone都是并列的。 OK,点apply, 再点OK,这样,就基本配置好了。 你这个时候,只要打开多个魔兽世界游戏,即可,keyclone会自动识别。如下图: 然后最小化keyclone,就会自动缩小在右下角了,进入游戏吧。我保证你会有时间需要使keyclone暂停的,这时你只要把鼠标右键点击keyclone的小图标,会出现小窗口,点override即可,再点一次就是恢复正常。 keyclone默认的是把所有键盘都镜像了,所以,你应该会要让某几个键位不镜像,譬如wasd,这个如果镜像了,再游戏里,会很乱,无法跟随。于是,你要进入setup,点do-not-pass,如下图: 在那里,先点击这行字,再按你要屏蔽的键盘,这样你屏蔽的键盘都会列表在上面的表里,你可以随时增加,取消。点apply和OK,就设置好了。 最后,在双机多开的操作中,另外一台电脑上的keyclone设置和以上的一样,只要把auto-connect的IP地址改成“你的IP地址:你设置的keyclone端口”即可,就能自动识别局域网里keyclone了。 以上是最简单的设置,基本上,以上的设置,就足以使你完成多开的任务了,更多更方便的设置你可以自己研究下。
恩,的确,这个Keyclone的功能是比AutoHotKey要来的强,而且更简单。所以我还是要向大家推荐,并且给大家一些简单的教程,好让大家快速上手。 首先下载破解版本,免安装的,双击Keyclone.exe,进入主界面,如下: 恩,这个是我现在的配置,你第一次打开时没有192.168.1.103:1442.....这一行的,别,咱们进入setup配置下,点setup,进入下图: 进入general这一项,先在keyclone name取个标识你的keyclone的名字,我随便取了个sony. local port是在两台电脑上联机使用keyclone的端口,只要你的端口没被占用,可以随便取,建议默认的就好。 send only 我一般是不勾的,因为这个项目是在另外一台电脑和你联机时,他通过keyclone发送的按键,这里也可以收到,如果勾了的话,就不能接收别机的键盘信号了。 auto-add windows titled,这个勾了的话,就可以自动识别你的windows窗口名,并自动加入到keyclone控制栏里了,exact name match,勾上就是精确识别下面设置的名称,建议勾上。最后在下面的文本框输入你要控制的各种窗口名字,恩,相信大家都是用来多开魔兽的,所以请写上"魔兽世界",台湾的写繁体版本的魔兽世界,欧美的写world of warcraft即可。 下面的几个pass mouse clicks,镜像鼠标点击(应该是只相应鼠标点击事件) distinguish left/right(区分鼠标左键和右键,对应pass mouse clicks) focus follows mouse,不知道到底有何作用,焦点跟随鼠标?我个人没有使用这个功能 always-on-top,使keyclone软件界面总在前面,基本不用 我都没勾,因为我个人觉得暂时用不到。 startup command我没使用 auto-connect,这个要好好设置下,主要是那些像我10开或15开的疯子,在2台电脑上利用keyclone联机使用多开的时候,利用这个,可以自动的连接2台电脑。如你所见,我在里面填的是192.168.1.103:1442 192.168.1.103是我的另外一台需要连接的电脑的内网IP地址,1442是上面填写的端口号。填写好后,每次打开keyclone软件,就自动添加了这个IP,并不停监听端口,你这个时候再打开另外一台电脑的keyclone,就会自动识别在这个主keyclone了。其实keyclone没有所谓主和副而言,在不同电脑的keyclone都是并列的。 OK,点apply, 再点OK,这样,就基本配置好了。 你这个时候,只要打开多个魔兽世界游戏,即可,keyclone会自动识别。如下图: 然后最小化keyclone,就会自动缩小在右下角了,进入游戏吧。我保证你会有时间需要使keyclone暂停的,这时你只要把鼠标右键点击keyclone的小图*出现小窗口,点override即可,再点一次就是恢复正常。 keyclone默认的是把所有键盘都镜像了,所以,你应该会要让某几个键位不镜像,譬如wasd,这个如果镜像了,再游戏里,会很乱,无法跟随。于是,你要进入setup,点do-not-pass,如下图: 在那里,先点击这行字,再按你要屏蔽的键盘,这样你屏蔽的键盘都会列表在上面的表里,你可以随时增加,取消。点apply和OK,就设置好了。 最后,在双机多开的操作中,另外一台电脑上的keyclone设置和以上的一样,只要把auto-connect的IP地址改成“你的IP地址:你设置的keyclone端口”即可,就能自动识别局域网里keyclone了。 ROUND-ROBIN 這個是設置某個鍵位輪流依次在各個遊戲窗口裏輸出。譬如聖騎士的神聖之錘,你可以輪流按神聖之錘所在的鍵位,第一次按是施放第一個窗口,第二次按是施放第二個窗口的。。。 接下来是宏的部分 当我在主窗口按了1后,其他的几个副窗口,都会得到1个“1”的数字输入,也就是可以实现后台操作。当然,这个时候只要在副窗口的号里设置了1个宏,并把这个宏放到按键1的位置,那么就成功啦。以下是宏的设置 ----------------------------------

64,282

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧