windowsAPI函数中文详解Word文件下载.docx

上传人:b****8 文档编号:22580643 上传时间:2023-02-04 格式:DOCX 页数:132 大小:113.39KB
下载 相关 举报
windowsAPI函数中文详解Word文件下载.docx_第1页
第1页 / 共132页
windowsAPI函数中文详解Word文件下载.docx_第2页
第2页 / 共132页
windowsAPI函数中文详解Word文件下载.docx_第3页
第3页 / 共132页
windowsAPI函数中文详解Word文件下载.docx_第4页
第4页 / 共132页
windowsAPI函数中文详解Word文件下载.docx_第5页
第5页 / 共132页
点击查看更多>>
下载资源
资源描述

windowsAPI函数中文详解Word文件下载.docx

《windowsAPI函数中文详解Word文件下载.docx》由会员分享,可在线阅读,更多相关《windowsAPI函数中文详解Word文件下载.docx(132页珍藏版)》请在冰豆网上搜索。

windowsAPI函数中文详解Word文件下载.docx

8

9return0;

10}

如果要根据窗口类名来获得窗口句柄话,只要给函数的第一个参数填类名,第二个参数窗口名填NULL,即可,用Spy++可查看窗口类名。

 

第二个:

SendMessage根据窗口句柄发送一个消息给窗口

函数定义:

LRESULT 

SendMessage(HWND 

hWnd,UINT 

Msg,WPARAM 

wParam,LPARAM 

IParam);

第一个参数是窗口句柄,第二参数个是消息类型,下面的消息表列举了所有消息,第三,四个参数是消息附带信息,解释依赖于消息类型,比如一个字符消息(WM_CHAR),那么第三个参数就储存有一个字符的ASCII码。

消息机制大家都应该知道吧,Windows是基于消息的系统,鼠标移动键盘按键都会产生消息。

接下来举一个例子,发送一个WM_CHAR消息给窗口,也就是模仿键盘按键,接收消息的窗口依旧以"

为例:

SendMessage例子:

模仿键盘按键

2

3intmain()

4

5{

7HWNDwnd;

8wnd=FindWindow(NULL,"

9

10while

(1)

11

12{

13

14SendMessage(wnd,WM_CHAR,WPARAM('

a'

),0);

15

16Sleep(300);

17

18}

19

20return0;

21

22}

呵呵上面的例子是不是没用,这是为什么呢,哪里出错了吗?

错倒是没有错,只是窗口句柄有问题,消息发送给了主窗口。

接收消息的窗口不对。

记事本窗口界面有些有什么东西呢?

菜单,编辑框, 

状态栏等控件,控件也是窗口,既然是窗口,那当然它们也有窗口句柄,而在记事本里是在哪里打字的?

编辑框控件里打字的嘛!

所以消息应该发送编辑框控件,那如何获得记事本里编辑框控件的窗口句柄呢?

用FindWindow吗?

不知道编辑框窗口标题名,类名也不知道,当然也有其它方法获取编辑框窗口标题名和窗口类名,如Spy++。

关于如何获得编辑框句柄,将在以后的函数中会有介绍,这里我们就用WindowFromPoint这个函数来获取,这个函数获取窗口句柄的方法比较笨,(相对于我这个例子来说),这个函数是根据什么来获取窗口句柄的呢?

根据屏幕坐标点,如屏幕坐标点20,20,当前是哪个窗口占有,就返回哪个窗口的句柄。

有了这个函数,我们还需要一个函数GetCursorPos获取鼠标当前位置(针对于屏幕);

可行的例子:

模仿键盘按键:

4{

5POINTcurpos;

//一个可储存坐标点的结构体变量,x横坐标,y,纵坐标,如curpos.xcurpos.y

7while

(1)

8{

9GetCursorPos(&

curpos);

//获取当前鼠标的位置,位置将储存在curpos里。

10HWNDhWnd=WindowFromPoint(curpos);

//根据curpos所指的坐标点获取窗口句柄

11SendMessage(hWnd,WM_CHAR,WPARAM('

g'

//发送一个字符(按键)消息g给当前鼠标所指向的窗口句柄

12Sleep(300);

//睡眠三百毫秒,相当于等待三分之一秒

13}

16}

这个程序一运行后,只要把鼠标指向要输入字符的窗口句柄,那么就相当于键盘每三分之一秒按了一个g键,试试吧!

如果这样觉得模仿键盘按键太麻烦的话,那么就用keybd_event这个函数,这个专门用于模仿键盘按键的,关于怎么用,自己XX一搜,就知道了。

既然SendMessage能模仿键盘按键的话,那也能模仿鼠标左击,右击。

而此时SendMessage函数第三,四个参数的解释就是储存有鼠标左击,右击时的位置。

如模仿鼠标右击,想一想,一次鼠标右击有哪几步,分别是鼠标右键按下,鼠标右键松开,如果你按下鼠标右键不松开,那它是不是鼠标右击,不是的,直到你松开鼠标右键,才能算是一次完整的鼠标右击.鼠标右键按下的消息类型是“WM_RBUTTONDOWN”,右键松开的消息是“WM_RBUTTONUP”,那么一次完整的鼠标右击应该是:

1SendMessage(wnd,WM_RBUTTONDOWN,0,0);

//鼠标右键按下,第三,四个参数说明了鼠标按下时的位置

2Sleep(100);

//间隔100毫秒

3SendMessage(wnd,WM_RBUTTONUP,0,0);

//鼠标右键松开

同样,也有一个专门模仿鼠标动作的函数,mouse_event这个函数,可以模仿鼠标的移动,单击,双击等。

以后会有专门介绍。

第三个:

GetCursorPos获取鼠标当前位置(屏幕)

这个函数在SendMessage函数有介绍,这里仅举一个例子,在界面里不停的输出鼠标当前位置。

3#include<

stdio.h>

5intmain()

7{

8POINTcurpos;

14GetCursorPos(&

16printf("

x:

%d,y:

%d"

curpos.x,curpos.y);

18Sleep(300);

20printf("

\n"

23}

第四个:

WindowFromPoint根据坐标点获得对应的窗口句柄

在SendMessage有解释,这里仅举一个例子,鼠标指向哪个窗口,就关闭哪个窗口。

7Sleep(2500);

//等待一会儿,用于把鼠标移到其它窗口上去,避免指向本身进程的窗口,关掉自己的窗口。

9POINTcurpos;

10

11while

(1)

12

13{

14

15GetCursorPos(&

16

17HWNDwnd=WindowFromPoint(curpos);

18

19SendMessage(wnd,WM_CLOSE,0,0);

20

21Sleep(300);

22

24

25}

第五个MoveWindow根据窗口句柄移动窗口,改变窗口大小

BOOL 

MoveWindow( 

hWnd, 

int 

X, 

Y, 

nWidth, 

nHeight, 

bRepaint 

hWnd是要改变大小的窗口的句柄,x,y相对于屏幕的坐标,窗口左上角的位置与之相对应,nWidth和nHeight是窗口新的宽高,bRepaint指定窗口是否重画。

这里依旧以"

为例子,改变这个窗口大小,并把窗口移到左上角去。

1#include<

2intmain()

3{

4HWNDwnd;

5wnd=FindWindow(NULL,"

6MoveWindow(wnd,0,0,220,120,NULL);

7return0;

8}

第六个ShowWindow设置窗口显示状态,如隐藏,最大化,最小化

函数定义BOOL 

ShowWinow(HWND 

hWnd,int 

nCmdShow);

 

SW_HIDE:

隐藏窗口并激活其他窗口。

第一个参数hWnd指明了窗口句柄,第二个参数指明了窗口的状态,现在给出第二个参数常用取值范围:

  SW_MAXIMIZE:

最大化指定的窗口。

  SW_MINIMIZE:

最小化指定的窗口并且激活在Z序中的下一个顶层窗口。

  SW_RESTORE:

激活并显示窗口。

如果窗口最小化或最大化,则系统将窗口恢复到原来的尺寸和位置。

在恢复最小化窗口时,应用程序应该指定这个标志。

SW_SHOW:

在窗口原来的位置以原来的尺寸激活和显示窗口。

ShowWindow例子:

程序运行后,在桌面上隐藏一个指定的窗口,并在4秒后再将其显示

6ShowWindow(wnd,SW_HIDE);

7Sleep(5000);

8ShowWindow(wnd,SW_SHOW);

第七个SetCursorPos设置鼠标的位置、把鼠标移动到指定的位置

SetCursorPos(int 

x,int 

y);

这个函数的两个参数我想大家应该知道是什么意思吧,屏幕的坐标点。

直接看例子:

4intsec=0;

5while(sec<

200)

6{

7SetCursorPos(rand()%1024,rand()%768);

//随机设置鼠标的位置

8Sleep(20);

9sec++;

11return0;

12}

第八个CopyFile复制一个文件

如何复制一个文件,比如,我要把E盘的abb.txt的文本文件复制到d盘的zhengyong.txt,则调用语句

1CopyFile("

e:

\\abb.txt"

"

d:

\\zhengyong.txt"

FALSE);

第三个参数有以下说明:

如果设为TRUE(非零),那么一旦目标文件已经存在,则函数调用会失败。

否则目标文件会被覆盖掉。

第九个DeleteFile删除一个文件

如何删除一个文件,语句:

DeleteFile("

e\\abb.txt"

既是删除

如果目标为隐藏或只读,则无用。

第十个CreateDirectory创建一个文件夹(目录)

假如E盘下什么文件也没有

CreateDirectory("

\\aaa\\bbb"

NULL);

这样是错的,不能同时建两个文件,除非E盘下已经有了个aaa文件夹了。

这样是对的CreateDirectory("

\\aaa"

第十一个:

GetClientRect获得窗口大小

看例子:

2#include<

3

4intmain(intargc,char*argv[])

6HWNDwnd;

9wnd=FindWindow(NULL,"

10RECTrect;

//专门用来存储窗口大小

11GetClientRect(wnd,&

rect);

//获取窗口大小

12printf("

%d,%d,%d,%d\n"

rect.left,rect.top,rect.right,rect.bottom);

//输出窗口大小,试着用鼠标改变窗口大小

13Sleep(300);

14}

15}

第十二个:

GetCWindowRect获得窗口大小(相对屏幕)

例子:

11GetWindowRect(wnd,&

试着去找一下GetClientRect和GetWindowRect之间有什么区别;

第十三个FindFirstFile寻找文件以及获得文件的信息

这里举一个例子吧,列举E盘第一目录下的所有文件,包括文件夹,结合FindNextFile

5BOOLdone=TRUE;

6WIN32_FIND_DATAfd;

7HANDLEhFind=FindFirstFile("

\\*.*"

&

fd);

//第一个参数是路径名,可以使用通配符,懂DOS的人应该知道吧!

fd存储有文件的信息

9while(done)

10{

11printf("

%s\n"

fd.cFileName);

12done=FindNextFile(hFind,&

//返回的值如果为0则没有文件要寻了

14return0;

当然也可以直接找一个文件,不使用通配符,但这样有什么意义呢?

,如FindFirstFile("

\\aaa.txt"

&

其实这个可以获取一个文件的信息,如文件是不是隐藏的,或者有没有只读属性等。

当然通过控制通配符,也可以寻找特定类型的文件,比如我只要找文本文件,那么就是这个语句FindFirstFile("

\\*.txt"

就行了,关键看你自己灵活运用。

前面说过fd里存储有文件的信息,那怎么根据fd里面的成员判断这个文件的属性,文件是否隐藏,是不是文件夹。

fd里的dwFileAttributes存储有文件的信息,如判断是否为文件夹,只要把这个变量和FILE_ATTRIBUTE_DIRECTORY进行按位与运算,如果为1的话,表明为文夹件,如if(fd.dwFileAttributes&

FILE_ATTRIBUTE_DIRECTORY==1) 

printf("

%s是文件夹\n"

其它判断也是一样,现在给出文件的属性(常用几个):

FILE_ATTRIBUTE_HIDDEN(隐藏)

FILE_ATTRIBUTE_READONLY(只读)FILE_ATTRIBUTE_SYSTEM(系统)

第十四个FindNextFile寻找文件

参照FindFirstFile函数的例子!

第十五个MoveFile移动文件

如把一个盘里的文本移到另一个盘里去:

MoveFile("

\\a.txt"

\\abc.txt"

即可,意思把e盘下的a.txt移到d盘下去,并改名为abc.txt

第十六个GetClassName根据窗口句柄获得窗口类名

GetClassName(HWND 

LPTSTR 

IpClassName, 

nMaxCount);

这种函数不需要再解释了吧,前面有太多类似的例子。

第十七个SetFileAttributes设置文件属性

SetFileAttributes( 

LPCTSTR 

lpFileName, 

DWORD 

dwFileAttributes);

这个函数的第二个参数dwFileAttributes和前面讲过的WIN32_FIND_DATA结构里的dwFileAttributes成员相对应。

假设E盘第一目录下有一个文本文件a.txt的正常文件,我要把它设为只读和隐藏那要如何做呢?

在前面介绍过WIN32_FIND_DATA结构里dwFileAttributes成员的几个常用属性,根据这个我们知道隐藏是FILE_ATTRIBUTE_HIDDEN,只读是FILE_ATTRIBUTE_READONLY。

那么把E盘下文本文件的属性设为隐藏和只读的语句就是:

SetFileAttributes("

FILE_ATTRIBUTE_HIDDEN|FILE_ATTRIBUTE_READONLY);

(说明:

这个函数同样也能设置文件夹属性)

虽然这个语句可以达到要求,但不建议用,因为会覆盖掉文件的原来属性,也就是说如果这个文件之前有系统属性(系统文件)的话,那么这个语句一旦执行后,文件就只有隐藏和只读属性了。

比如一个文件原先就有隐藏属性,依旧以a.txt为例子,那么我把它设为只读,是不是这个语句就可以呢?

FILE_ATTRIBUTE_READONLY);

这样的话,虽然文件有只读属性了,但隐藏属性却没有了。

那要如何在不覆盖掉原来的属性下,把文件设为只读呢,其实说了这么多的废话,总结起来就一句话:

如何增加一个文件的属性!

前提是要获得这个文件的原有属性:

获得文件的属性,在FindFirstFile函数讲过。

好吧!

假设e盘的a.txt文件属性为隐藏,给它增加只读属性:

5WIN32_FIND_DATAfd;

6FindFirstFile("

7fd.dwFileAttributes|=FILE_ATTRIBUTE_READONLY;

//在原来的属性下增加只读属性

8SetFileAttributes("

fd.dwFileAttributes);

//设置文件的属性

第二个例子:

如何去掉一个文件的属性

(补习一下,懂的人直接跳过)

我想懂这里的按位或、按位与或者按位异或运算的人应该知道该如何去掉一个文件的属性。

其实一个文件信息都是以二进制代码说明的。

比如一个八位二进制码:

10000010,这里的每一位是不是只有0和1取值,不是0,就是1,正好符合一个文件属性的有无,如这个文件是隐藏的吗?

只有是和不是,这样我们规定把这八位二进制码的第一位用于确定文件是否具有隐藏属性,如果为1那便是隐藏,无则没有,以此类推第二位就代表文件的只读,第三位系统。

但要如何判断呢,或者把某一位的值改变呢,用按位运算就可以,00000010,我要把第2位的值设为0,其它位上的值保持不变,用按位异或运算即可,与00000010进行按位异或运算,但这里并不是与它本身进行运算,不管任何八位二进制数的值是多少只要与00000010进行按位异或运算,那第二位都会变成0,而其它的位保持不变。

这样为了方便,我们就把00000010进行宏定义,方便记忆,这个二进制数的十进制为2。

宏定义#define 

FILE_ATTRIBUTE_READONLY 

2

明白了这个我们就来清除一个文件的一种属性吧!

清除一个文件的隐藏属性,假设a.txt为隐藏文件:

//获取文件信息

7fd.dwFileAttributes^=FILE_ATTRIBUTE_HIDDEN;

//在原来的属性下删除隐藏属性

如果单单只针对文件的属性进行操作的话,可以用GetFileAttributes函数获取文件的属性,该函数只一个参数,那就是文件的路径,函数返回一个DWORD值,包含文件属性信息。

第十八个ShellExecute运行一个程序函数定义:

ShellExecute(HWND 

hwnd, 

LPCSTR 

lpOperation, 

lpFile, 

lpParameters, 

lpDirectory, 

INT 

nShowCmd);

第一个参数hwnd是父窗口的句柄,可以为NULL,第二个参数lpOperation表示行为,第三个参数lpFile是程序的路径名,第四个参数lpParameters是给所打开程序的参数,可以为NULL,第五个参数lpDirectory可以为NULL,第六个参数nShowCmd跟ShowWindow函数的第二个参数一样,作用也一样,如果打开的程序有窗口的话,这个参数就指明了窗口如何显示.例如打开一个记事本:

1ShellExecute(NULL,"

open"

NOTEPAD.EXE"

NULL,NULL,SW_SHOWNORMAL);

而且这个函数还可以指定程序打开一个属于程序本身类型的文件,假如e盘有一个a.txt文件;

我调用函数运行记事本程

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 党团工作 > 党团建设

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1