我真的不会!

无语孩童 2009-06-10 01:47:31
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
type
TMainWindow = packed record
ProcessID: THandle;
MainWindow: THandle;
end;
PMainWindow = ^TMainWindow;

var
Form1: TForm1;

implementation

function IsMainWindow(AHandle: THandle): Boolean;
begin
Result := (GetWindow(AHandle, GW_OWNER) = 0) and IsWindowVisible(AHandle);
{
GetWindow
函数功能:该函数返回与指定窗口有特定关系(如Z序或所有者)的窗口句柄。
函数原型:HWND GetWindow(HWND hWnd,UNIT nCmd);

IsWindowVisible
函数功能:该函数获得给定窗口的可视状态。;
函数原型:BOOL IsWindowVisible(HWND hWnd);
}
end;

function fFindMainWindow(hWnd: THandle; lParam: PMainWindow): BOOL; stdcall;
var
vProcessID: THandle;
begin
vProcessID := GetWindowThreadProcessId(hWnd, vProcessID);
{
WinAPI: GetWindowThreadProcessId - 获取指定窗口的进程 ID 或线程 ID
GetWindowThreadProcessId(
hWnd: HWND; //指定窗口句柄
lpdwProcessId: Pointer = nil //返回进程ID的指针
): DWORD; //返回线程ID
}
if (lParam^.ProcessID = vProcessID) and IsMainWindow(hWnd) then
begin
lParam^.MainWindow := hWnd;
Result := False;
end else
Result := True;
end;

function FindMainWindow(AProcess: THandle): THandle;
var
vMainWindow: PMainWindow;
begin
vMainWindow.ProcessID := AProcess;
vMainWindow.MainWindow := 0;
EnumWindows(@fFindMainWindow, integer(vMainWindow));
Result := vMainWindow.MainWindow;
end;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
try
Caption := Format('Application.Handle: %d, FindMainWindow(): %d', [
Application.Handle, FindMainWindow(GetCurrentProcessId)]);
except
end;
end;

end.




运行出错,至于为什么我也不清楚,哪位高手能帮我看一下
...全文
33 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
无语孩童 2009-06-11
  • 打赏
  • 举报
回复
谢谢 genispan
anypsky 2009-06-10
  • 打赏
  • 举报
回复
把问题说明白先。我打酱油的~~~~
mathsfan 2009-06-10
  • 打赏
  • 举报
回复
直接路过...
luntanwujianhua 2009-06-10
  • 打赏
  • 举报
回复
這麼多,頭都大了
genispan 2009-06-10
  • 打赏
  • 举报
回复

function FindMainWindow(AProcess: THandle): THandle;
var
vMainWindow: PMainWindow;
begin
New(vMainWindow); // 加上这个
vMainWindow.ProcessID := AProcess;
vMainWindow.MainWindow := 0;
EnumWindows(@fFindMainWindow, Integer(@vMainWindow));
Result := vMainWindow.MainWindow;
end;
iqyely 2009-06-10
  • 打赏
  • 举报
回复
这是要实现什么功能呢?来关注下。

5,386

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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