请教JAVA中用JNA获得窗口句柄后,如何捕获该窗口是否d出了窗口(类似MessageBox)

请教JAVA中用JNA获得窗口句柄后,如何捕获该窗口是否d出了窗口(类似MessageBox),第1张

楼主,是想得到窗口句柄吗,可以使用JNA

参考 WIN32 API

typedef struct

{

HWND hWnd;

DWORD dwPid;

}WNDINFO;

BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM lParam)

{

WNDINFO pInfo = (WNDINFO)lParam;

DWORD dwProcessId = 0;

GetWindowThreadProcessId(hWnd, &dwProcessId);

if(dwProcessId == pInfo->dwPid)

{

pInfo->hWnd = hWnd;

return FALSE;

}

return TRUE;

}

HWND GetHwndByProcessId(DWORD dwProcessId)

{

WNDINFO info = {0};

infohWnd = NULL;

infodwPid = dwProcessId;

EnumWindows(EnumWindowsProc, (LPARAM)&info);

return infohWnd;

}

function MessageBox(hWnd: HWND; Text, Caption: PChar; Type: Word): Integer;

hWnd:对话框父窗口句柄,对话框显示在Delphi窗体内,可使用窗体的Handle属性,否则可用0,使其直接作为桌面窗口的子窗口。

Text:欲显示的信息字符串。

Caption:对话框标题字符串。

Type:对话框类型常量。

该函数的返回值为整数,用于对话框按钮的识别。

参考用法如下:

1 MessageBox("这是一个最简单的消息框!");

2 MessageBox("这是一个有标题的消息框!","标题");

3 MessageBox("这是一个确定 取消的消息框!","标题", MB_OKCANCEL );

4 MessageBox("这是一个警告的消息框!","标题", MB_ICONEXCLAMATION );

5 MessageBox("这是一个两种属性的消息框!","标题",

MB_ICONEXCLAMATION|MB_OKCANCEL );

6 if(MessageBox("一种常用的应用","标题

" ,MB_ICONEXCLAMATION|MB_OKCANCEL)==IDCANCEL)

return;

注意:

以上消息框的用法是在CWnd的子类中的应用,如果不是,则要MessageBox(NULL,"ddd","ddd",MB_OK); 或MessageBox(hWnd,"ddd","ddd",MB_OK); hWnd为某窗口的句柄,或者直接用AfxMessageBox。

如果有多个窗口句柄,就会返回

xxx|yyy|zzz|,这样的形式,所以要用数组函数把它们分离

Hwnd = Split("HwndEx,"I", -1, 1)

If UBound(Hwnd)>-1 Then

For i=0 To UBound(Hwnd)

MessageBox Hwnd(i)

Next

End If

//这样,就可以分离它们,其中Hwnd(0)=xxx,Hwnd(1)=yyy,Hwnd(2)=zzz

大家知道,在一个大型复杂的系统中,有时会调用一些外部程序来帮助我们完成某些特定功能。

我们常用的函数有两个,WinExec(),ShellExecute(),因为ShellExecute()函数主要用于Win32下,功能也强大一些,故而本文只对后者进行讨论。

首先,我们粗略地研究一下ShellExecute()的几个参数:

hwnd:窗体的句柄;

lpOperation:打开程序执行的 *** 作,共预留有“open”、“explore”、“print”三种方式,此参数可以省略,此时将依据打开的文件(lpFile)的类型执行相应的 *** 作,比如:如果lpFile为一文本文件,那么将会在与该文件相关联的程序中打开它;

lpFile:文件名;

lpParamerters:打开文件时所需的参数;

lpDirectory:文件名所在的路径,当然,一般来说,在Windows中登“记记”过的程序(如WinWord)不必提供此参数;

该函数的详细文档请读者朋友参阅相应帮助。

其次,我们来举一个例子(以“记事本”为例):

procedure TForm1OpenBtnClick(Sender:TObject);beginShellExecute(handle,'open','notepadexe',nil,nil,SW_ShowNormal);end;读者朋友可以在你的Delphi环境下试试这段代码,当然,由于使用Windows的API函数,请加上ShellAPI单元。

要关闭一个外部程序,只需向他发送一条消息就行了,比如,SendMessage(ExeHandle,WM_Close,0,0);

了FindWindow()函数,它能够解决这个问题,它有两个参数:

lpClassName:程序的类名;

lpWindowName:程序窗体的标题。

第一种情况也是最简单情况的就是提供确定的[“确定的”加着重号]“lpWindowName”参数,如下例:

procedure TForm1CloseAppClick(Sender: TObject);//确定标题

var Exehandle:Thandle;begin//获得句柄--标题确定

ExeHandle:=findWindow(nil,'文件管理器');//返回句柄//关闭程序if ExeHandle<0 then

SendMessage(ExeHandle,WM_Close,0,0)elseApplicationMessageBox('没有打开“文件管理器”!','提示', MB_IconInformation+MB_OK);end;另一种情况是程序窗体没有确定的[“没有确定的”加着重号]标题,这就是很多朋友出现疑问的地方,也是几乎所有参考书均不涉及的地方。比如打开“写字板”程序,它的标题会随着文本文件名的不同而不同,此时,你要关闭它,就不得不提供程序的类名,但是如何获得程序的类名呢?笔者在这里向大家介绍一个可行的办法:首先打开程序(此处以“记事本”为例),然后,运行WinSight32(Delphi自带)或Spy++(VC自带),找到程序(“记事本”)的运行状态,即可找到我们需要的类名(两者均为“Class Name”项)。参考一个例子:

procedure TForm1CloseVAppClick(Sender: TObject);//标题不确定

var ExeHandle:Thandle;begin//获得句柄--标题不确定

ExeHandle:=FindWindow('notepad',nil);//'');//返回句柄//关闭程序if ExeHandle<0 then

SendMessage(ExeHandle,WM_Close,0,0)elseApplicationMessageBox('没有打开“记事本”程序!','提示', MB_IconInformation+MB_OK);end;当然,既能提供程序的类名又能提供程序窗体的标题自然就没有讨论的必要了。

这样,我们就可以在自己的程序中打开并关闭任意的外部程序了。

以上就是关于请教JAVA中用JNA获得窗口句柄后,如何捕获该窗口是否d出了窗口(类似MessageBox)全部的内容,包括:请教JAVA中用JNA获得窗口句柄后,如何捕获该窗口是否d出了窗口(类似MessageBox)、VS2010 的问题 MFC 中 MessageBox()用法、按键精灵获取窗体句柄 有个 竖等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/10066280.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-04
下一篇2023-05-04

发表评论

登录后才能评论

评论列表(0条)

    保存