C#中如何调用按键精灵插件
c语言中各种符号含义
c语言中各种符号含义
1.#:预处理符号,用于在程序编译前进行一些预处理操作。
2. ;:语句结束符号,用于表示一行语句的结束。
3. {}:代码块,用于组织多条语句。
4. ():括号,用于表示运算的优先级和函数的参数列表。
5. []:方括号,用于表示数组的下标。
6. +:加号,用于做加法运算。
7. -:减号,用于做减法运算。
8. *:乘号,用于做乘法运算。
9. /:除号,用于做除法运算。
10. %:取余符号,用于求两个数的余数。
11. =:赋值符号,用于将右侧的值赋给左侧的变量。
12. ==:等于符号,用于判断两个数是否相等。
13. !=:不等于符号,用于判断两个数是否不相等。
14. >:大于符号,用于判断左侧的数是否大于右侧的数。
15. <:小于符号,用于判断左侧的数是否小于右侧的数。
16. >=:大于等于符号,用于判断左侧的数是否大于或等于右侧的数。
17. <=:小于等于符号,用于判断左侧的数是否小于或等于右侧的数。
18. &&:逻辑与符号,用于判断两个条件是否都成立。
19. ||:逻辑或符号,用于判断两个条件是否有一个成立。
20. !:逻辑非符号,用于取反一个条件。
21. &:取地址符号,用于获取变量的地址。
22. *:指针符号,用于声明指针变量和操作指针所指向的值。
23. sizeof:运算符,用于获取数据类型的大小。
24. ->:成员访问符号,用于访问结构体或指向结构体的指针的成员。
25. typedef:关键字,用于给数据类型起一个新的名字。
26. struct:关键字,用于定义结构体类型。
以首字母C为开头的词缀
以首字母C为开头的词缀
cad,cas,cid 表示落下,降临
例如:casu al偶然的;casu alty事故;灾难;oc cas ion发生;时机;de ca ent颓废的;ac cid ental偶然的;coin cid e巧合;同时发生;coin cid ence巧合;in cid ent 偶然事件;oc cid ent西方;de ca y衰退;腐败;
Cand 表示白,发光;
例如cand id坦白的,直率的;cand or坦白;cand idate侯选人;cand ela烛光;cand le蜡烛;cand esc ence发光;in cand escent白热的;遇热发光的;
cant,cent 表示唱,歌
例如:cant术语;暗语;re cant撤消;;ac cent口音;重音;ac cent uate强调;重读;in cent ive激励;刺激力量(in进入+cent唱+ive→把〔力量〕唱进去→激励)
cap,capt,cept,ceive,cip,cup 表示拿,抓,握住
例如:cap acity容量,才能;cap acious宽阔的;容积大的(cap acity形容词);in cap acitate使无能;capt ion标题;字幕;capt ive俘虏;capt ure逮捕,捉拿;capt ious 吹毛求疵的;ac cept接受;承认;ac cept ability可接受性;con cept ion概念,观念;de cept ive欺骗性的;in cept ion开始,开端;inter cept拦截,阻止;pre cept箴言;re cept acle容器;ex cept除外;con ceive想象;构想;con ceiv able可想象的;de ceive欺骗;per ceive知觉;发觉;re ceive接受;收到;re ceipt收据;自大;anti cip ate预料;预期的;in cip ient开始的;初期的;eman cip ate解放;eman cip ation 解放;muni cip al参加;共享;parti cip ant参与者;prin cip al主要的;首要的;re cip ietn接受者;oc cup y占领;使用;oc cup ant占有者;oc cup ation职业;占有;preoc cup ation全神贯注
C语言程序设计课件
1.2 简单的C语言程序介绍
• /*ex101.c-在屏幕上输出This is a C program. */
• • • • •
#include <stdio.h> void main( ) { printf(“This is a C program.\n”); }
①注释
/*ex101.c-在屏幕上输出This is a C program. */
链 接
• 链接是将与当前程序有关的、已经有的几个目标模块链接 在一起,形成一个完整的程序代码文件。这些已经有的目 标模块有: • · 库函数:如前面使用的printf; • · 对于大的程序,常常分成几个模块,分别编写、编辑和 编译,形成不同的目标模块。 • 经正确链接所生成的文件才是可执行文件。可执行文件的 文件名后缀为.exe(有的系统为.out)。完成链接过程的 软件称为链接器(linker)。 • 程序在连接过程中,也可能发现错误。这时也要重新进入 编辑器进行编辑。
函数名
void main( ) { printf(“This is a C program.\n”);
函数体 演示ex101 语句
}
④语句
printf(“This is a C program.\n”);
• C语言的主函数体由一些语句组成。每个语句由 一个分号结束。如本例中,主函数的一个语句: • printf (“This is a C program.\n”);
c字母开头的单词
c字母开头的单词
C字母开头的单词有很多,比如:cat(猫)、camel(骆驼)、car(汽车)、cow(牛)、cake(蛋糕)、city(城市)、cloud(云)、cup(杯子)、computer(电脑)、clock (钟)、cry(哭)、candy(糖果)等等。
C字母开头的单词不仅有动物,还有交通工具、食物、家具、用具等等,它们的出现让我
们的生活更加丰富多彩。比如说,car不仅可以让我们出行更加便捷,还可以带来快乐的
旅行体验;computer让我们的工作效率更高,也可以为我们提供更多的娱乐方式;cake是一种美味可口的食物,也可以成为欢庆的象征。
C字母开头的单词丰富了我们的生活,让我们的生活更加精彩。
c字视力表
C字视力表如下:
C型视力表指兰氏环形视力表,主要用来检测飞行员等对视力有高度要求职业的人员兰氏环形视力表是采用7.5毫米正方形中有1.5毫米宽度的环,环上有1.5毫米宽的缺口,呈C字形。
标准视力以小数记录为1.0。如视力为N,这意味着在5米处可以看到的环形缺口是毫米平方毫米中的毫米宽缺口。朗肯圆标度采用算术级数计算,递增率分别为0.1、0.2。。。。。。2.0,用十进制方法记录。
开启方向越大,准确判断各视觉标准开启方向的概率越低,检验精度越高。视力表只有四个方向,概率为25%,而C视力表有八个开放方向,概率为12.5%。
扩展资料:
C字表的优势:
对于没有散光或散光已经全部矫正的情况下,两种视觉表之间只有一两行不同。e视觉表的视觉灵敏度优于C视觉表。但对于散光患者,如果散光没有得到纠正,那么随着散光度数的增加,两种视力表的差异就更加明显。
在所有屈光不正患者中,散光患者占屈光不正患者总数的85%以上。由于散光眼的屈光度在各个方向上不一致,散光患者在辨别开放方向时在各个方向上有不同的反应。
例如:对于180度方向的近视散光,在垂直方向上容易区分开孔,但在斜向和水平方向上很难判断开孔。因为散光眼睛在判断两个视觉指标的开启方向上有很大的差异,所以C和e视力表在验光精度上的优势和劣势会更加明显。
C开头的单词
词汇表(C-D):
cabbage n.洋白菜,卷心菜cabin n.小屋;船舱,机舱cabinet n.橱,柜;内阁cable n.缆,索;电缆;电报cafe n.咖啡馆;小餐厅cafeteria n.自助食堂
cage n.笼;鸟笼,囚笼
cake n.饼,糕,蛋糕calculate vt.计算;估计;计划calculation n.计算,计算结果calculator n.计算器,计算者calendar n.日历,历书;历法call vt.把…叫做;叫,喊calm a.静的,平静的
camel n.骆驼
camera n.照相机,摄影机camp n.野营,营地,兵营campaign n.战役;运动campus n.校园,学校场地can aux.v.能,会,可能
can n.罐头,听头;容器Canada n.加拿大
Canadian a.加拿大的
canal n.运河;沟渠;管cancel vt.取消,撤消;删去cancer n.癌,癌症,肿瘤candidate n.候选人;投考者candle n.蜡烛;烛形物;烛光candy n.糖果;砂糖结晶cannon n.大炮,火炮;榴弹炮canoe n.独木舟,皮艇,划子canteen n.小卖部;临时餐室canvas n.粗帆布;一块油画布cap n.帽子,便帽;帽状物capable a.有能力的,有才能的capacity n.容量;能力;能量capital n.资本,资金;首都captain n.陆军上尉;队长captive n.俘虏,被监禁的人capture vt.捕获,俘获;夺得car n.汽车,小汽车,轿车carbon n.碳
C语言之三目运算符
C语⾔之三⽬运算符
三⽬运算符
三⽬运算符:也叫三元运算符。这个运算符的符号是: ? :
语法:
表达式1 ? 表达式2 : 表达式3;
语义:
先执⾏表达式1,执⾏完毕,表达式1的结果如果为真,那么执⾏表达式2,并且这个整体的运算式的结果是表达式2的结果,否则执⾏表达式3,运算式的结果是表达式3的结果
跟
if(表达式1){
表达式2;
}else{
表达式3;
}
⽤⼀个⼝⽔化来表达三⽬表达式:
表达式1 ? 表达式2 : 表达式3;
表达式1成⽴吗?成⽴执⾏表达式2,否则执⾏表达式3
tips:代码例⼦如下
#include <stdio.h>
int main(int argc, const char * argv[]) {
// int res = 1 ? 10 : 20;
// printf("res=%d\n",res);//10
// int res = 0 ? 10 : 20;
// printf("res=%d\n",res);//20
//三⽬表达式和if-else语句可以互换
/*
// int num1=10,num2=20,num3=30;
// int res = num1 ? num1+num2 : num1+num3;
// printf("res=%d\n",res);//30
// int num1=10,num2=20,num3=30;
// int res = 0;
//
// if(num1){
// res = num1 + num2;
// }else{
// res = num1 + num3;
C语言编程规范—命名规则
C语⾔编程规范—命名规则
C是⼀门朴素的语⾔,你使⽤的命名也应该这样。与Modula-2和Pascal程序员不同,C程序员不使⽤诸
如“ThisVariableIsATemporaryCounter”这样“聪明”的名字。C程序员应该叫它“tmp”,这写起来更简单,也不会更难懂。
然⽽,当⾯对复杂情况时就有些棘⼿,给全局变量取⼀个描述性的名字是必要的。把⼀个全局函数叫做“foo”是⼀种⽬光短浅的⾏为。全局函数也⼀样,如果你有⼀个统计当前⽤户个数的函数,应当把它命名为“count_active_user()”或者简单点些的类似名称,不应该命名
为“cntusr()”。
3.1 三种流⾏的命名法则
⽬前,业界共有四种命名法则:驼峰命名法、匈⽛利命名法、帕斯卡命名法和下划线命名法,其中前三种是较为流⾏的命名法。
(1)驼峰命令法。正如它的名称所表⽰的那样,是指混合使⽤⼤⼩写字母来构成变量和函数的名字。例如,下⾯是分别⽤骆驼式命名法和下划线法命名的同⼀个函数:
printEmployeePaychecks();
print_employee_paychecks();
第⼀个函数名使⽤了驼峰命名法,函数名中的每⼀个逻辑断点都有⼀个⼤写字母来标记。第⼆个函数名使⽤了下划线法,函数名中的每⼀个逻辑断点都有⼀个下划线来标记。
驼峰命名法近年来越来越流⾏了,在许多新的函数库和Microsoft Windows这样的环境中,它使⽤得当相多。另⼀⽅⾯,下划线法是C出现后开始流⾏起来的,在许多旧的程序和UNIX这样的环境中,它的使⽤⾮常普遍。
排列组合a和c的区别
排列组合a和c的区别
C(组合)与A(排列)最本质的区别在于对取出的元素是否进⾏排序或者说有顺序要求。A即所谓排列,就是指从给定个数的元素中取出指定个数的元素进⾏排序。C即组合则是指从给定个数的元素中仅仅取出指定个数的元素,不考虑排序。
区别
排列数就是从n个不同元素中,任取m(m≤n)个元素(被取出的元素各不相同),按照⼀定的顺序排成⼀列,叫做从n个不同元素中取出m个元素的⼀个排列。
组合数是指从n个不同元素中,任取m(m≤n)个元素并成⼀组,叫做从n个不同元素中取出m个元素的⼀个组合;从n个不同元素中取出m(m≤n)个元素的所有组合的个数,叫做n个不同元素中取出m个元素的组合数。⽤符号c(m,n)表⽰。
例:从26个字母中选5个
排列:A(26,5)表⽰的是从26个字母中选5个排成⼀列;即ABCDE与ACBDE与ADBCE等这些是不⼀样的。
组合:C(26,5)表⽰的是从26个字母中选5个没有顺序;即ABCDE与ACBDE与ADBCE等这些是⼀样的。
《C语言基础教案》
《C语言基础教案》word版教案章节:
一、C语言概述
1. C语言的历史和发展
2. C语言的特点和应用范围
3. C语言的编译过程
二、C语言基础语法
1. 数据类型
整型、浮点型、字符型
变量和常量的声明和使用2. 运算符和表达式
算术运算符
关系运算符
逻辑运算符
赋值运算符
条件运算符
逗号运算符
3. 控制语句
条件语句
循环语句
跳转语句
三、函数和数组
1. 函数的定义和声明
2. 函数的参数传递
3. 函数的返回值
4. 数组的声明和使用
5. 字符串的操作
四、指针和引用
1. 指针的概念和声明
2. 指针的运算
3. 指针与数组
4. 指针与函数
5. 指针与动态内存分配
五、结构体和文件操作
1. 结构体的定义和声明
2. 结构体的使用
3. 文件的概念和打开
4. 文件的读写操作
5. 文件的关闭和错误处理
六、顺序结构与分支结构
1. 顺序结构的实现
2. 分支结构的概念与实现
3. 条件语句的嵌套
4. 逻辑表达式与布尔类型
七、循环结构
1. 循环结构的概念与类型
2. for循环的实现与应用
3. while循环的实现与应用
4. do-while循环的实现与应用
5. 循环控制语句:break与continue
八、数组与字符串
1. 一维数组的声明、初始化与操作
2. 二维数组的概念与操作
3. 字符串的基本操作
4. 字符串数组的应用
5. 排序算法与数组的应用
九、指针与内存管理
1. 指针的基本概念与运算
2. 指针与数组的关系
3. 指针与函数的调用
4. 指针与动态内存分配
5. 内存管理:malloc、calloc、realloc与free
十、结构体与联合体
c字开头是什么火车
c字开头是什么火车?
如今,我国的铁路进入了高速发展的时代,客运列车也出现了很多种类,除了G字、D字、Z字、T字、K字、y字开头的列车外,还有C字开头的列车。
很多人都知道,G字头是高速动车组旅客列车,D字头是动车组旅客列车,Z字头是直达特快旅客列车,T字头是特快旅客列车,K字头是快速旅客列车,y字头是旅游列车,那么,跟G、D字头外观相似的C字头火车是什么火车呢?下面一起来了解一下。#原创作者专属任务#
C字头列车是城际动车组列车
C字开头,后面带一串数字编号的火车是城际动车组列车,因为“城”的开头拼音是C,城际列车的简称就为C,俗称C字头列车,铁路系统标准念法为“城X次”或“城际XX次”。城际铁路是指专门服务于相邻城市间或城市群的快速、便捷、高密度客运专线铁路,用于运行距、离较短的车次,车上一般不配置卧铺车厢。
C字头列车的特点
C字头列车有三个特性:1、国铁特性;2、动车组特性;3、城际专线特性。
C字头列车是在国家铁路线上运营的城际动车组旅客列车,不区分直达或每站停模式的列车,可以在城际铁路上运营,也能在区际铁路或干线铁路上运营。不过,大部分还是在城际铁路线开行的。在车次等级的方面,C字头车次的地位低于G字头车次,高于其他任何车次,即
G>C>D>Z>T>K>L。
C字头列车主要用于加强附近城市间的联络,方便周边地区之间的跨市出行和人们交流的高速动车组,运行距离不长,一般在300公里以内,强调的是旅客列车的城际性,跟速度没有什么关系。有的城际列车速度快,有的比较慢。如北京至天津之间的C字头列车速度高达310千米每小时,广州至深圳的C字头列车速度只有190千米每小时。
c的书写格式及笔顺
c的书写格式及笔顺
汉字“C”是一个比较简单的字,它的书写格式和笔顺如下:
1. 首先,先写横向的一笔,从左到右,长度大约占整个字宽的一半。
2. 然后,从横线的中间位置,向下写一个竖直的一笔,长度略微超过横线的一半。
3. 最后,从竖线的底部向右下方写一个斜线,连接到横线的末端。
总体来说,汉字“C”的书写格式比较简单,也比较规范,符合汉字书写的基本规律。希望我的回答能够帮到你。
c开头的常见姓氏
c开头的常见姓氏
常见的以C开头的姓氏包括:
1. 曹 (Cao)
2. 蔡 (Cai)
3. 陈 (Chen)
4. 常 (Chang)
5. 仇 (Qiu)
6. 柴 (Chai)
7. 成 (Cheng)
8. 程 (Cheng)
9. 崔 (Cui)
10. 董 (Dong)
11. 窦 (Dou)
12. 杜 (Du)
13. 邓 (Deng)
14. 丁 (Ding)
15. 戴 (Dai)
16. 杨 (Yang)
17. 袁 (Yuan)
18. 叶 (Ye)
19. 尹 (Yin)
20. 尤 (You)
这只是一些常见的姓氏,实际还有很多其他以C开头的姓氏。
C语言中将数字转换为字符串的方法(转自c语言中文网)
C语⾔中将数字转换为字符串的⽅法(转⾃c语⾔中⽂⽹)
C语⾔提供了⼏个标准库函数,可以将任意类型(整型、长整型、浮点型等)的数字转换为字符串。以下是⽤itoa()函数将整数转换为字符串的⼀个例⼦:
# include <stdio. h>
# include <stdlib. h>
void main (void)
{
int num = 100;
char str[25];
itoa(num, str, 10);
printf("The number 'num' is %d and the string 'str' is %s. \n" ,
num, str);
}
itoa()函数有3个参数:第⼀个参数是要转换的数字,第⼆个参数是要写⼊转换结果的⽬标字符串,第三个参数是转移数字时所⽤的基数。在上例中,转换基数为10。
下列函数可以将整数转换为字符串:
----------------------------------------------------------
函数名作⽤
----------------------------------------------------------
itoa() 将整型值转换为字符串
itoa() 将长整型值转换为字符串
ultoa() 将⽆符号长整型值转换为字符串
----------------------------------------------------------
请注意,上述函数与ANSI标准是不兼容的。能将整数转换为字符串⽽且与ANSI标准兼容的⽅法是使⽤sprintf()函数,请看下例:
%c在c语言中的用法
%c在c语言中的用法
C语言是一种通用的高级程序设计语言,由美国计算机科学家Dennis Ritchie于1972年在贝尔电话实验室开发而成。C语言的设计目的是用于系统编程,尤其是操作系统和其他大型软件的编写。它是一种结构化、面向过程的编程语言,同时也支持面向对象编程,具有高效性、可移植性和可扩展性等优点。在C语言中,%c是一种格式控制符,用于读取或输出一个字符。
1. 输出字符
要输出一个字符,需要使用printf()函数,并在字符前加上格式控制符%c,表示输出字符。例如,下面的代码将输出字母'A':
```
printf("%c", 'A');
```
除了直接输出字符外,还可以通过输入一个整数,再通过强制类型转换的方式将其转换成字符,然后再输出字符。例如,下面的代码将输出ASCII码为65的字符'A':
2. 读取字符
在读取字符时,需要注意一些细节。首先,scanf()会读取空白字符,例如空格、制表符和换行符等,因此要使用一个空格或换行符来消耗掉它们;其次,如果要读取多个字符,可以使用%c格式控制符并在循环中反复调用scanf()函数。
3. 字符数组
字符数组是一种特殊的数组类型,它用于存储多个字符。在C语言中,字符数组的定义方式如下:
```
char str[100];
```
这段代码定义了一个长度为100的字符数组str,可以用来存储最多100个字符。要给字符数组赋值,可以使用strcpy()函数,例如:
```
char str[100] = "Hello world";
printf("%s", str);
C、D、G、Z开头的旅客列车代表什么意思
"C"、"D"、"G"和"Z"开头的旅客列车代表什么意思? 分别代表C——城际列车(注:这个是城市圈兴起后才有的,多半往返于大城市与周围的卫星城市,即对接大城市及小城市或超大城市与其他大中型城市),D——动车(组),G——高速列车(即高铁),Z——直达(列)车。补充一些吧,也许您会要用得到的:没有字母的四位车次——普通列车 Z —— 直达特快列车(简称:直特,读作:直) T —— 特别快车(简称:特快,读作:特)(跨局:1~399,管内401~999) K —— 快速列车(简称:快速,读作:快) N —— 铁路局管内快速列车(简称:管快,读作:内) X —— 直达行邮行包专列(读作:行) 临时列车:(跨局:1~499,管内501~999) L —— 临时旅客列车列车(简称:临客,读作:临) A —— 按需临时加车(简称:临时加车,临外临,读作:A) Y —— 临时旅游列车(简称:旅游列车,读作:游)Z开头的列车:直达特别快速旅客列车,简称直特,字母Z是“直”字的汉语拼音简写。这样的列车在行程中一站不停或者经停必须站但不办理客运业务,这类列车的车底都是25T,全部都是空调列车。所有的直特列车都是跨局(不是在一个铁路局内)运营列车。这类列车是从2004年04月18日铁路第五次提速后才出现的,以前铁路虽然也有过直特列车,但都混遍在特快列车车次里。 T开头的列车:特别快速旅客列车,简称特快,字母T是“特”字汉语拼音的简写。这样的列车在行程中一般只经停省会城市或当地的大型城市。这类列车的车底一般都是25K(蓝皮车),因为25K的停产,所以新开行或改换车底的特快列车开始采用25T车底,也有部分特快列车采用25Z、25KS、25BS、25Z等车底,全部都是空调列车。T系列的特快列车车次在300以前的是跨局运营列车,300以后的是管内(只在一个铁路局内)运营的列车。 K开头的列车:快速旅客列车,简称快速,字母K是“快”字汉语拼音的简写。这样的列车在行程中一般只经停地级行政中心或重要的县级行政中心。这类列车的车底一般是25G(红皮车)25B改的空调车也是红皮的,还有少部分是22型和25B型绿皮车,基本都是空调列车。2004年04月18日铁路第5次提速之前K系列车包括跨局运营和管内运营的快速列车,以后由于K系列车次的增加,将跨局快速列车和管内快速列车分开,所以现在K系列的列车都是跨局运营的列车。 N开头的列车:管内快速旅客列车,简称管内快速,字母N是“内”字汉语拼音的简写。这样的列车一般经停一些重要车站。这类列车的
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
C#中如何调用按键精灵插件
原来是为了在游戏外挂中发送键盘鼠标消息,自己写个sendmessage或者是postmessage又比较麻烦。于是google了一下,发现现在很多脚本工具都有这个功能,其中按键精灵的一个叫361度的插件已经有这个的实现,还验证过了。为什么不拿来己用呢?首先分析一下按键精灵插件的接口,发现:
插件的功能函数没有直接暴露出来,而是通过一个GetCommand的函数返回一个函数描述结构。
接下来看看这个结构:
上面这个结构我已经是转换成C#的对应结构了,原结构可以查看按键精灵提供的插件C++接口源代码。
这个结构里面的handlerFunction 实际上是指向函数的入口点,也就是一个函数指针,每个函数都一样是2个参数:
typedef int (*QMPLUGIN_HANDLER)(char *lpszParamList, char *lpszRetVal); 转换为C#中相应的委托为:
delegate void Invoker(string parameters, StringBuilder returnValue);
大家注意到,有两个参数,c++原型中都是char*类型,转换为C#的delegate后第一个为string,第二个为StringBuilder。这是因为parameters是in的,dll中不会对这个参数做修改,而returnValue是out的,dll返回时候要把返回值写入这个StringBuilder的缓冲区。
原本的想法是用C++写一个桥来调用dll,不过在.net 2.0 中,框架直接提供了
Marshal.GetDelegateForFunctionPointer 来转换一个函数指针为一个委托,这就方便多拉。请看下面代码,注意看BGKM_ExecuteCommand 这个函数里面的东西。
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
namespace WJsHome.Game.Utility
{
public class QMacro
{
[DllImport("BGKM5.dll", EntryPoint = "GetCommand")]
static extern IntPtr BGKM_GetCommand(int commandNum);
[StructLayout(LayoutKind.Sequential)]
class QMPLUGIN_CMD_INFO
{
public string commandName;
public string commandDescription;
public IntPtr handlerFunction;
public uint paramNumber;
}
delegate void Invoker(string parameters, StringBuilder returnValue);
static string BuildParameters(params object[] parameters)
{
StringBuilder sb = new StringBuilder();
for (int i = 0; i < parameters.Length; i++)
{
sb.Append(parameters[i].ToString());
if (i != parameters.Length - 1)
{
sb.Append(',');
}
}
return sb.ToString();
}
static void BGKM_ExecuteCommand(int cmdNum, string parameters, Stri ngBuilder retVal)
{
IntPtr pCmdInfo = BGKM_GetCommand(cmdNum);
QMPLUGIN_CMD_INFO cmdInfo = new QMPLUGIN_CMD_INFO();
Marshal.PtrToStructure(pCmdInfo, cmdInfo);
Invoker invoker = Marshal.GetDelegateForFunctionPointer(cmdInfo.ha ndlerFunction, typeof(Invoker)) as Invoker;
invoker(parameters, retVal);
}
public static void BGKM_KeyClick(IntPtr hWnd, int key)
{
BGKM_ExecuteCommand(0, BuildParameters(hWnd, key), null);
}
public static void BGKM_KeyDown(IntPtr hWnd, int key)
{
BGKM_ExecuteCommand(1, BuildParameters(hWnd, key), null);
}
public static void BGKM_Mouse(IntPtr hWnd, int code, int x, int y)
{
BGKM_ExecuteCommand(15, BuildParameters(hWnd, code, x, y), null); }
public static WinApi.POINT BGKM_ScrToCli(IntPtr hWnd, int x, int y)
{
StringBuilder retVal = new StringBuilder();
BGKM_ExecuteCommand(16, BuildParameters(hWnd, x, y), retVal);
string[] tmp = retVal.ToString().Split('|');
return new WinApi.POINT(int.Parse(tmp[0]), int.Parse(tmp[1]));
}
}
}
好了,方便哇?这样一来,我们可以在.net上面实现动态加载和卸载Win32 dll. 具体思路就是:(还是代码来得方便)
public delegate int MsgBox(int hwnd,string msg,string cpp,int ok);
[DllImport("Kernel32")]
public static extern int GetProcAddress(int handle, String funcname); [DllImport("Kernel32")]
public static extern int LoadLibrary(String funcname);
[DllImport("Kernel32")]
public static extern int FreeLibrary(int handle);
private static Delegate GetAddress(int dllModule, string functionname, Type t) {