我用FindWindow(),为什么返回hwnd总是等于0?

cbings 2009-07-05 07:01:51
我的代码是这样写的:
CommonDialog3.InitDir = App.Path & "\Anal_Temp\"
CommonDialog3.Filter = "文档文件(*.txt)|*.TXT|所有文件(*.*)|*.*"
CommonDialog3.DialogTitle = "打开"
CommonDialog3.FileName = "T_OUT.TXT"
CommonDialog3.ShowOpen

Dim Phwnd As Long, ChildHwnd As Long
Phwnd = FindWindow(vbNullString, "打开")
If Phwnd <> 0 Then
ChildHwnd = FindWindowEx(Phwnd, 0, "Button", "取消")
SendMessage ChildHwnd, BM_CLICK, 0, ByVal 0&
End If

结果跟踪显示Phwnd的值总是等于0,请问各位,到底是怎么回事?
...全文
365 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
Sandrer 2009-07-06
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 supermanking 的回复:]
用Windows消息的处理过程来处理是可以的,你按照以下方式来测试:
建议一个新的EXE工程,默认窗口,名为Form1,然后在窗口中添加一个CommonDialog控件,
名称为默认的CommonDialog1,然后再添加一个Label控件,名称也是默认的Label1

然后再向工程添加一个模块,名称为默认的Module1
Form1窗口全部代码如下:
VB codePrivate DeclareFunction GetWindowLong Lib"user32" Alias"GetWindowLongA" (ByVal hWndAsLong, ByVal nIndexAsLong)AsLongPrivate DeclareFunction SetWindowLong Lib"user32" Alias"SetWindowLongA" (ByVal hWndAsLong, ByVal nIndexAsLong, ByVal dwNewLongAsLong)AsLongPrivateConst GWL_WNDPROC= (-4)PrivateSub Command1_Click()
ysWindowProc= GetWindowLong(Me.hWnd, GWL_WNDPROC)
FunctionProc= SetWindowLong(Me.hWnd, GWL_WNDPROC, AddressOf WindowProc)
CommonDialog1.DialogTitle="打开"
CommonDialog1.ShowOpenEnd Sub
Module1模块全部代码如下:
VB codePublic ysWindowProcAsLongPublic FunctionProcAsLongPrivate DeclareFunction CallWindowProc Lib"user32" Alias"CallWindowProcA" (ByVal lpPrevWndFuncAsLong, ByVal hWndAsLong, ByVal MsgAsLong, ByVal wParamAsLong, ByVal lParamAsLong)AsLongPrivate DeclareFunction FindWindow Lib"user32" Alias"FindWindowA" (ByVal lpClassNameAsString, ByVal lpWindowNameAsString)AsLongPrivate DeclareFunction SetWindowLong Lib"user32" Alias"SetWindowLongA" (ByVal hWndAsLong, ByVal nIndexAsLong, ByVal dwNewLongAsLong)AsLongPrivateConst GWL_WNDPROC= (-4)PublicFunction WindowProc(ByVal hWndAsLong, _
ByVal wMsgAsLong, _
ByVal wParamAsLong, _
ByVal lParamAsLong)AsLongDim dghWndAsLong
dghWnd= FindWindow("#32770","打开")If dghWnd<>0Then
Form1.Label1.Caption="目标窗口:"& dghWnd
SetWindowLong hWnd, GWL_WNDPROC, ysWindowProcElse
WindowProc= CallWindowProc(FunctionProc, hWnd, wMsg, wParam, lParam)EndIfEnd Function

然后运行,当点击按钮时,会弹出打开对话框,可以看到,窗口中的Label1的文字改变成了:
"目标窗口:"和找到的对话框句柄,以上步骤在Win2003+VB6+SP6调试通过。
[/Quote]

如果真像楼主说的那样是为了拦截外部程序的对话框,那么我觉得你的这段代码没什么用了。


楼主只是为了测试才在自己的窗口创建“打开”对话框~~~
如果是外部程序的话,估计楼主的程序也不需要使用窗体了,所以也接收不到窗口消息。
只需要在 Sub Main 函数里使用循环(加DoEvents 和一个 Sleep(1) 来防止CPU占用问题)来查找窗口就行了。

如果楼主的程序需要一个窗口,那么你这段代码就一定要在外部程序运行之后,才能运行。
估计用户也不会这么傻点完这个再点另外一个程序吧,那我还不如直接点“打开”对话框的关闭按钮~~

那么如果先运行你的代码,再去打开外部程序的话,那么你的窗口已经失去焦点。
外部程序运行后,你的窗口也不会有任何消息了。那么子类化函数中的代码也执行不了~
Sandrer 2009-07-06
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 cbings 的回复:]
引用 2 楼 chenjl1031 的回复:
要在Timer事件中使用FindWindow


我现在在用了一个timer1,代码改成:
Form_Load中:
    Me.Timer1.Enabled = False
    Me.Timer1.Interval = 1
cmd_click中:
    Me.Timer1.Enabled = True
    CommonDialog3.InitDir = App.Path & "\Anal_Temp\"
    CommonDialog3.Filter = "文档文件(*.txt)|*.TXT|所有文件(*.*)|*.*"
    CommonDialog3.DialogTitle = "打开"
    CommonDialog3.FileName = "T_OUT.TXT"
    CommonDialog3.ShowOpen
Timer1_Timer中:
    Timer1.Enabled = False
    Phwnd = FindWindow(vbNullString, "打开")
    If Phwnd <> 0 Then
      ChildHwnd = FindWindowEx(Phwnd, 0, "Button", "取消")
      SendMessage ChildHwnd, BM_CLICK, 0, ByVal 0&
      Unload Me
  End If

“打开”对话框打开后,还是不能自动关闭,一点反应也没有,该怎么办?:(


注:我是shell一个外部exe程序,那个程序一定得打开一次对话框,所以我只好模拟来一次,然后马上让它关闭。

[/Quote]

有可能是因为你的时间间隔太快了,“打开”对话框还没被创建,Timer 函数就被执行了!
而你在 Timer 函数中未经过任何验证就把 Timer 禁止了,而没有继续执行下去

你可以尝试把 Timer1.Enabled 写在 If Phwnd <> 0 Then 里面,就是当找到了窗口才停止计时器
Sandrer 2009-07-06
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 supermanking 的回复:]
引用 12 楼 sandrer 的回复:
如果真像楼主说的那样是为了拦截外部程序的对话框,那么我觉得你的这段代码没什么用了。


楼主只是为了测试才在自己的窗口创建“打开”对话框~~~
如果是外部程序的话,估计楼主的程序也不需要使用窗体了,所以也接收不到窗口消息。
只需要在 Sub Main 函数里使用循环(加DoEvents 和一个 Sleep(1) 来防止CPU占用问题)来查找窗口就行了。

如果楼主的程序需要一个窗口,那么你这段代码就一定要在外部程序运行之后,才能运行。
估计用户也不会这么傻点完这个再点另外一个程序吧,那我还不如直接点“打开”对话框的关闭按钮~~

那么如果先运行你的代码,再去打开外部程序的话,那么你的窗口已经失去焦点。
外部程序运行后,你的窗口也不会有任何消息了。那么子类化函数中的代码也执行不了~

看来你的逻辑很不清楚。如果是外部程序,根本就不会遇到外部程序的模式窗口弹出而影响内部Timer
事件产生的问题,当然不用这么做。
但是,他现在的问题是因为本身程序的模式窗口弹出后,中止了Timer事件的产生,才会遇到这样的问题。
[/Quote]

好吧,经过测试,的确我11楼的想法错了~~~~~

但是呢,我还是觉得你在10楼的代码中(我没测试过外部程序),如果楼主在真正应用中真把你的代码写到他自己的窗口中,那么就不会有用了吧!
楼主只是为了方便测试,所以才在自己的程序里头创建模态对话框。
真正的问题还是外部程序的问题,除非你的程序是全局钩子咯。

那么如果真要用Timer来检测外部程序的话,按照楼主5楼的代码,在按钮的处理函数中把创建模态对话框的代码删去,还是会遇到一个先后运行的顺序问题。
如果楼主的程序先运行,那么在Timer函数中,还没找到目标句柄就过早的关闭了计时器。
而如果先运行外部程序,再运行楼主的程序,也是不行,不能达到楼主所要的效果,即外部程序的模态对话框还是会弹出来,起码可以让用户看得见。
现在还是人类 2009-07-06
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 sandrer 的回复:]
有可能是因为你的时间间隔太快了,“打开”对话框还没被创建,Timer 函数就被执行了!
而你在 Timer 函数中未经过任何验证就把 Timer 禁止了,而没有继续执行下去

你可以尝试把 Timer1.Enabled 写在 If Phwnd <> 0 Then 里面,就是当找到了窗口才停止计时器
[/Quote]
估计你自己都不知道这个是怎么回事。
你最好自己测试一下,建一个窗口,里面放个Timer控件,然后在Timer事件里不停的加一个数字并显示
在你的窗口上,然后做个按钮,里面就是作弹出对话框的操作,你可以看看,当你电击按钮弹出打开对话
框的时候,下面窗口的数字还动不动?不可能是因为太快或是很么其他的原因,因为当模式窗口弹出后,
Timer事件根本就停止了,所以将捕获这种模式窗口的工作放到Timer事件里根本就不可能被执行。
现在还是人类 2009-07-06
  • 打赏
  • 举报
回复
用Windows消息的处理过程来处理是可以的,你按照以下方式来测试:
建议一个新的EXE工程,默认窗口,名为Form1,然后在窗口中添加一个CommonDialog控件,
名称为默认的CommonDialog1,然后再添加一个Label控件,名称也是默认的Label1

然后再向工程添加一个模块,名称为默认的Module1
Form1窗口全部代码如下:

Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Const GWL_WNDPROC = (-4)
Private Sub Command1_Click()
ysWindowProc = GetWindowLong(Me.hWnd, GWL_WNDPROC)
FunctionProc = SetWindowLong(Me.hWnd, GWL_WNDPROC, AddressOf WindowProc)
CommonDialog1.DialogTitle = "打开"
CommonDialog1.ShowOpen
End Sub

Module1模块全部代码如下:

Public ysWindowProc As Long
Public FunctionProc As Long
Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Const GWL_WNDPROC = (-4)

Public Function WindowProc(ByVal hWnd As Long, _
ByVal wMsg As Long, _
ByVal wParam As Long, _
ByVal lParam As Long) As Long

Dim dghWnd As Long
dghWnd = FindWindow("#32770", "打开")
If dghWnd <> 0 Then
Form1.Label1.Caption = "目标窗口:" & dghWnd
SetWindowLong hWnd, GWL_WNDPROC, ysWindowProc
Else
WindowProc = CallWindowProc(FunctionProc, hWnd, wMsg, wParam, lParam)
End If
End Function


然后运行,当点击按钮时,会弹出打开对话框,可以看到,窗口中的Label1的文字改变成了:
"目标窗口:"和找到的对话框句柄,以上步骤在Win2003+VB6+SP6调试通过。
现在还是人类 2009-07-06
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 sandrer 的回复:]
如果真像楼主说的那样是为了拦截外部程序的对话框,那么我觉得你的这段代码没什么用了。


楼主只是为了测试才在自己的窗口创建“打开”对话框~~~
如果是外部程序的话,估计楼主的程序也不需要使用窗体了,所以也接收不到窗口消息。
只需要在 Sub Main 函数里使用循环(加DoEvents 和一个 Sleep(1) 来防止CPU占用问题)来查找窗口就行了。

如果楼主的程序需要一个窗口,那么你这段代码就一定要在外部程序运行之后,才能运行。
估计用户也不会这么傻点完这个再点另外一个程序吧,那我还不如直接点“打开”对话框的关闭按钮~~

那么如果先运行你的代码,再去打开外部程序的话,那么你的窗口已经失去焦点。
外部程序运行后,你的窗口也不会有任何消息了。那么子类化函数中的代码也执行不了~
[/Quote]
看来你的逻辑很不清楚。如果是外部程序,根本就不会遇到外部程序的模式窗口弹出而影响内部Timer
事件产生的问题,当然不用这么做。
但是,他现在的问题是因为本身程序的模式窗口弹出后,中止了Timer事件的产生,才会遇到这样的问题。
PctGL 2009-07-05
  • 打赏
  • 举报
回复
用timer的话就要在编译后才有效果,在 showopen之前一句启动timer,
或者用 settimer 也可以
贝隆 2009-07-05
  • 打赏
  • 举报
回复
学习
btxdlibin 2009-07-05
  • 打赏
  • 举报
回复
对话框是个模式窗口,打开后代码执行暂停,等待你对对话框处理完才继续执行.

在对话框打开期间,你后面的代码并没有被执行.而当你手动处理完对话框后,对话框关闭,FindWindow就检查不到了.

你可以另写个程序来检测.
东方之珠 2009-07-05
  • 打赏
  • 举报
回复
要在Timer事件中使用FindWindow
嗷嗷叫的老马 2009-07-05
  • 打赏
  • 举报
回复
CommonDialog3.ShowOpen 是阻塞执行.....在你关闭"打开"窗口前后面语句不会执行.

而你关闭后,窗体已经不存在了....要是此时返回了句柄,那就见鬼了.....

楼主的调试基本功还需要练习......这问题就算想不到,通过调试也能轻易发现.
cbings 2009-07-05
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 chen8013 的回复:]
你要注意一下:
Phwnd = FindWindow(vbNullString, "打开")
这一句,那个外部exe程序的打开对话框的标题栏内容是不是“打开”呀?
你要按它的实际内容把‘打开’替换。

[/Quote]

这个没有问题的
舉杯邀明月 2009-07-05
  • 打赏
  • 举报
回复
你要注意一下:
Phwnd = FindWindow(vbNullString, "打开")
这一句,那个外部exe程序的打开对话框的标题栏内容是不是“打开”呀?
你要按它的实际内容把‘打开’替换。
cbings 2009-07-05
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 chenjl1031 的回复:]
要在Timer事件中使用FindWindow
[/Quote]

我现在在用了一个timer1,代码改成:
Form_Load中:
Me.Timer1.Enabled = False
Me.Timer1.Interval = 1
cmd_click中:
Me.Timer1.Enabled = True
CommonDialog3.InitDir = App.Path & "\Anal_Temp\"
CommonDialog3.Filter = "文档文件(*.txt)|*.TXT|所有文件(*.*)|*.*"
CommonDialog3.DialogTitle = "打开"
CommonDialog3.FileName = "T_OUT.TXT"
CommonDialog3.ShowOpen
Timer1_Timer中:
Timer1.Enabled = False
Phwnd = FindWindow(vbNullString, "打开")
If Phwnd <> 0 Then
ChildHwnd = FindWindowEx(Phwnd, 0, "Button", "取消")
SendMessage ChildHwnd, BM_CLICK, 0, ByVal 0&
Unload Me
End If

“打开”对话框打开后,还是不能自动关闭,一点反应也没有,该怎么办?:(


注:我是shell一个外部exe程序,那个程序一定得打开一次对话框,所以我只好模拟来一次,然后马上让它关闭。
cbings 2009-07-05
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 myjian 的回复:]
CommonDialog3.ShowOpen 是阻塞执行.....在你关闭"打开"窗口前后面语句不会执行.

而你关闭后,窗体已经不存在了....要是此时返回了句柄,那就见鬼了.....

楼主的调试基本功还需要练习......这问题就算想不到,通过调试也能轻易发现.
[/Quote]

那我该怎么弄才能让commonDialog3不用我点“取消”就自动关闭呢?直接删除CommonDialog3.ShowOpen这一句,好像就相当于对话框没打开过,整段都白写了。
VC获得进程ID获得主线程ID获得窗口句柄获得主窗口获得进程名 1.窗口类名 窗口句柄 窗口标题 窗口句柄 HWND FindWindow( LPCTSTR lpClassName, //窗口类名 可用 VC或者VS自带的Spy++查看 LPCTSTR lpWindowName //窗口标题 ); 举例: 以 记事本为例, 记事本 窗口类名 为:NotePad, 窗口标题 视按具体情况而定,假设为"新建 文本文档.txt - 记事本" 窗口类名 窗口句柄 TCHAR lpClassName[]=TEXT("NotePad"); HWND hWnd=::FindWindow(lpClassName,NULL); if(hWnd && IsWindow(hWnd)) ::ShowWindow(hWnd,SW_HIDE); 窗口标题 窗口句柄 TCHAR lpWindowName[]=TEXT("新建 文本文档.txt - 记事本"); HWND hWnd=::FindWindow(NULL,lpWindowName); if(hWnd && IsWindow(hWnd)) ::ShowWindow(hWnd,SW_HIDE); 2.窗口句柄 进程ID 窗口句柄 主线程ID 要使用到的函数: DWORD GetWindowThreadProcessId( HWND hWnd, //目标窗口句柄 LPDWORD lpdwProcessId //返回目标窗口对应进程ID ); 例子: DWORD dwProcId=0;//存放返回的进程ID DWORD dwThreadId=0;//存放返回的主线程ID HWND hWnd=XXXX;//这里省略,可能用任务方式得到一个窗口的句柄.比如用1中的方法. dwThreadId=GetWindowThreadProcessId(hWnd,&dwProcId);//同时得到进程ID和主线程ID. 3.窗口HAND CWnd 用CWnd::FromHandle(HWND hWnd)函数.很多类都有这个函数. 4.进程名 进程ID (注:进程名,即在"任务管理器"中看到的名字) 用CCheckObject类(详细实现源文件); 例子: 以记事本为例,进程名为 NOTEPAD.EXE (不一定是大写哦,得到任务管理器是显示而定); CCheckObject ch; TCHAR Name[]=TEXT("NOTEPAD.EXE"); DWORD dwProcId=ch.GetProcessId(Name); 5. 进程名 主线程ID 例子: CCheckObject ch; TCHAR Name[]=TEXT("NOTEPAD.EXE"); DWORD dwThreadId=ch.GetThreadId(Name); 6. 进程名 主窗口句柄 CCheckObject ch; TCHAR Name[]=TEXT("NOTEPAD.EXE"); HWND hWnd=ch.GetTargetWindowHanle(Name); 7. 其它说明 从CCheckObject类和上面的源码中,不难写出从 进程ID 主线程ID 进程ID 主窗口句柄 主线程ID--->主窗口句柄 等等其它类似转换. 对于主窗口,特点如下: A. 不能用进程ID,要用线程ID,因为一个进程可能有多个线程,每个线程都可能会有主窗口. B. 主窗口不会有WS_CHILD属性 C. 主窗口没有父窗口 D. 主窗口一般都有子窗口(这个不是一定的,但是具有普遍性)
VC++ JPEG与BMP图像互转。 JPG图形库只有14个函数,他们都是非常有用的: 1. void init_jpeg() <---jpgdll中的函数 1. void init_jpeg1() <--jpegdll中的函数 本函数初始化JPEG API动态链接库,它必须在其它JPEG API函数之前调用。在程序中此函数只须调用一次。 函数调用语句样例: init_jpeg(); . 2. void findwindow(char *title) 1. void findwindow1(char *title) 本函数取程序窗口的图形句柄,用于其它函数绘图处理。 Title为程序窗口的标题,若标题很长,取前几个字就可以了。 函数调用语句样例: hl=findwindow("JPEG TEST"); . 3. long showjpg(char *fliename, long hwnd, long left, long top) 2. long showjpg1(char *fliename, long hwnd, long left, long top) 本函数打开一个JPG图形文件,并在窗口的(left,top)位置显示。 hwnd为窗口图形句柄,(left,top)为图形显示的左上角位置。 函数调用语句样例: rs=showjpg("c:\jpgdemo\demo.jpg",hwnd,10,10) .. 4. long show_bmp(char *fliename, long hwnd, long left, long top) 3. long show_bmp1(char *fliename, long hwnd, long left, long top) 本函数打开一个BMP图形文件,并在窗口的(left,top)位置显示。 hwnd为窗口图形句柄,(left,top)为图形显示的左上角位置。 函数调用语句样例: rs=showbmp("c:\jpgdemo\demo.bmp",hwnd,10,10) . 5. long jpg_to_bmp(char *jpgfilename, char *bmpfilename) 5. long jpg_to_bmp1(char *jpgfilename, char *bmpfilename) 本函数将一个JPG图形文件转换为BMP图形文件。 函数调用语句样例: rs=jpg_to_bmp("c:\jpgdemo\demo.jpg","c:\temp\demo.bmp") . 6. long bmp_to_jpg(char *jpgfilename, char *bmpfilename,long quality) 5. long bmp_to_jpg1(char *jpgfilename, char *bmpfilename,long quality) 本函数将一个BMP图形文件转换为JPG图形文件。 Quality为转换的质量和图形压缩情况,取值0-100。一般取75。 函数调用语句样例: rs=bmp_to_jpg("c:\jpgdemo\demo.bmp","c:\temp\demo.jpg",75) . 7. long copy_to_bmp(long hwnd, char *bmpfilename, long type) 6. long copy_to_bmp1(long hwnd, char *bmpfilename, long type) 本函数将程序窗口内容硬拷贝到一个BMP图形文件。 hwnd为窗口图形句柄, Type=0, 拷贝整个窗口。 Type=1, 拷贝用户区域 函数调用语句样例: rs=copy_to_bmp("c:\temp\demo.bmp",hwnd,0) . 8. long copy_to_jpeg(long hwnd, char *bmpfilename, long type,long quality) 7. long copy_to_jpeg1(long hwnd, char *bmpfilename, long type,long quality) 本函数将程序窗口内容硬拷贝到一个JPG图形文件。 hwnd为窗口图形句柄, Type=0, 拷贝整个窗口。 Type=1, 拷贝用户区域 quality为图形质量,取值0-100。一般取75。 函数调用语句样例: rs=copy_to_jpeg("c:\temp\demo.jpeg",hwnd,0,75) . 9. long to_clip(long hwnd, long type) 8. long to_clip1(long hwnd, long type) 本函数将程序窗口内容硬拷贝到剪贴板,你可以用"Paste"方式在其它图形软件中编辑。 hwnd为窗口图形句柄, Type=0, 拷贝整个窗口。 Type=1, 拷贝用户区域 函数调用语句样例: rs=to_clip(hwnd,0) . 10. long clip_to_jpeg(char *name,long hl,long quality) 10 long clip_to_jpeg1(char *name,long hl,long quality) 本函数将当前剪贴板上的图形硬拷贝到一个JPG图形文件。 hwnd为窗口图形句柄, Type=0, 拷贝整个窗口。 Type=1, 拷贝用户区域 quality为图形质量,取值0-100。一般取75。 函数调用语句样例: rs=clip_to_jpeg("bird2.jpg",hWnd,75); . 11. long clip_to_bmp(char *name,long hl) 11. long clip_to_bmp1(char *name,long hl) 本函数将当前剪贴板上的图形硬拷贝到一个JPG图形文件。 hwnd为窗口图形句柄, 函数调用语句样例: rs=clip_to_bmp("bird2.bmp",hWnd,75); . 12. void Area_Copy(long hl,long left,long top,long w,long h) 12. void Area_Copy1(long hl,long left,long top,long w,long h) 本函数将程序窗口上的一个区域的内容硬拷贝到剪贴板,你可以用"Paste"方式在其它图形软件中编辑。 hwnd为窗口图形句柄, (left,top)为图形拷贝区域左上角位置 w为图形拷贝区域的宽度 h为图形拷贝区域的高宽度 函数调用语句样例:Area_Copy(hWnd,0,0,300,400); . 13. long Area_to_jpeg(long hl,long left,long top,long w,long h,char * name,long qa) 13.long Area_to_jpeg1(long hl,long left,long top,long w,long h,char * name,long qa) 本函数将程序窗口上的一个区域的内容硬拷贝到JPG图形文件。 hwnd为窗口图形句柄, (left,top)为图形拷贝区域左上角位置 w为图形拷贝区域的宽度 h为图形拷贝区域的高宽度 quality为图形质量,取值0-100。一般取75。 函数调用语句样例:Area_to_jpeg(hWnd,0,0,300,400,"bird3.jpg",75); . 14. long Area_to_bmp(long hl,long left,long top,long w,long h,char * name) 14. long Area_to_bmp1(long hl,long left,long top,long w,long h,char * name) 本函数将程序窗口上的一个区域的内容硬拷贝到BMP图形文件。 hwnd为窗口图形句柄, (left,top)为图形拷贝区域左上角位置 w为图形拷贝区域的宽度 h为图形拷贝区域的高宽度 函数调用语句样例:Area_to_bmp(hWnd,0,0,300,400,"bird3.bmp");

1,486

社区成员

发帖
与我相关
我的任务
社区描述
VB API
社区管理员
  • API
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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