| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1714 人关注过本帖
标题:DLL变量共享的问题
只看楼主 加入收藏
newCpp
Rank: 5Rank: 5
来 自:火星
等 级:职业侠客
威 望:3
帖 子:256
专家分:375
注 册:2009-8-17
结帖率:97.83%
收藏
已结贴  问题点数:40 回复次数:5 
DLL变量共享的问题
如题
我想搞个记录键盘的程序
但是记录的话,只能够记录当前调用DLL程序上按下的键码其他的程序上按下键码的话,他就记录不了
郁闷,找了个共享变量的方法但是调用的时候有问题。贴上代码各位帮忙看一下谢谢
程序代码:
#include <windows.h>
struct inkedl
{
    int code;//按键码
    int typel;//类型
    inkedl *next;
};
#pragma data_seg("Shared")

extern "C" inkedl *head=NULL;
#pragma data_seg( )
#pragma comment( linker, "/SECTION:Shared,RWS")
void create(int code,int typel=0)
{
    inkedl *fp;
    inkedl *point;

point=new inkedl;
point->code=code;
point->typel=typel;
if (head==NULL)
{
head=point;
point->next=NULL;
return ;
}
if (head->next==NULL)
{
point->next=head->next;
head->next=point;
//head->typel=1;
return ;
}

 fp=head;
for (inkedl *&mp=head;mp->next;mp=mp->next)
{
if (mp->next->next==NULL)
{
point->next=mp->next->next;
mp->next->next=point;
head=fp;
return ;
}
}
}

extern "C" _declspec(dllexport) void sethook();

HHOOK gouzi=NULL;

LRESULT CALLBACK KeyboardProc(
  int code,       // hook code
  WPARAM wParam,  // virtual-key code
  LPARAM lParam   // keystroke-message information
)
{
if(((DWORD)lParam&0x40000000) && (HC_ACTION==code))
{
switch(wParam)
{
case VK_NUMPAD0: create(96,0);/*MessageBox(NULL,"0","提示",0);*/break;
case VK_NUMPAD1:create(97,0);break;
case VK_NUMPAD2: create(98,0);break;
case VK_NUMPAD3: create(99,0);break;
case VK_NUMPAD4: create(100,0);break;
case VK_NUMPAD5:create(101,0);break;
case VK_NUMPAD6: create(102,0);break;
case VK_NUMPAD7:create(103,0);break;
case VK_NUMPAD8: create(104,0);break;
case VK_NUMPAD9: create(105,0);break;
case VK_UP: create(38,0);break;
case VK_DELETE: create(46,0);break;
case VK_SHIFT: create(16,0);break;
case VK_MENU:create(18,0);break;
case VK_CONTROL: create(17,0);break;
}
}
// return CallNextHookEx(gouzi,code,wParam,lParam);
return 0;
}
extern "C"  _declspec(dllexport) void sethook()
{
gouzi=SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,GetModuleHandle("win32DLL.dll"),0);
}



extern "C" _declspec(dllexport) void playback()//链表回放
{
inkedl *fp=head;
if (head==NULL)
{
    // void sethook();
//MessageBox(NULL,"0111","提示",0);
}
while(head)
{

keybd_event(head->code,KEYEVENTF_EXTENDEDKEY,0,0);
keybd_event(head->code,KEYEVENTF_KEYUP,0,0);

if (head->next==NULL)
{
    head=fp;
}
head=head->next;
}
}
虽然乱了点儿,我想凑合看还是没问题的吧??


搜索更多相关主题的帖子: 变量 DLL 
2010-09-28 09:36
hahayezhe
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:湖南张家界
等 级:贵宾
威 望:24
帖 子:1386
专家分:6999
注 册:2010-3-8
收藏
得分:8 
GetModuleHandle("win32DLL.dll")??

2010-09-28 13:33
你们都要疼我哦
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:火星
等 级:贵宾
威 望:49
帖 子:1296
专家分:2746
注 册:2008-7-13
收藏
得分:8 
我和楼主是同乡 真是两眼泪汪汪

小妹,哥哥看你骨骼清奇,绝非凡人,将来必成大业,不如这样,你先把裤裤脱了,待哥哥为你开启灵窍,然后我们一起努力钻研如何
2010-09-29 22:52
cnfarer
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:179
帖 子:3330
专家分:21157
注 册:2010-1-19
收藏
得分:8 
要用全局钩子!

★★★★★为人民服务★★★★★
2010-09-30 06:43
lucky563591
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:4
帖 子:765
专家分:2103
注 册:2009-11-18
收藏
得分:8 
学习了。
2010-09-30 07:36
东海一鱼
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:48
帖 子:757
专家分:4760
注 册:2009-8-10
收藏
得分:8 
SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,GetModuleHandle("win32DLL.dll"),0)
第三个参数,2楼问的好。他应该是一个进程的实例句柄。而不是什莫win32DLL.dll的模块句柄,你可以在DLL初始化时将进程的实例句柄保存起来。
再有就是这个例子根本用不到共享变量,可以直接无视。因为你挂接的本身就是一个全局钩子。任何一个使用键盘I/O的进程,系统都会帮你把DLL挂载进去。
所以根本不需要共享变量的帮助。

举世而誉之而不加劝,举世而非之而不加沮,定乎内外之分,辩乎荣辱之境,斯已矣。彼其于世未数数然也。
2010-09-30 11:19
快速回复:DLL变量共享的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018846 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved