如何取得无窗口应用程序的应用程序句柄

lanjian 2008-07-28 12:20:43
program test;

uses
SysUtils,
Windows;
var
HMutex: THandle;
h:THandle; //应用程序句柄

begin

//程序只执行一次
HMutex := CreateMutex(nil, False, '54BAB749-13BA-4468-84D6-08ABC2A6F837');
if WaitForSingleObject(hMutex, 0) = wait_TimeOut then
begin
Exit;
end;

h := //这里怎么取应用程序句柄
//这里不用Application.Handle; 这种方式。因为有些原因需要应用程序比较小。用 Application 对象的话,就可引用Forms单元,应用程序就会变大了很多。
//没有引用Forms时只有40K多,用了Forms后就变成360多K了~~想看这里有没有直接用API函数来取得的

end.
...全文
160 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
okmnji79513 2008-07-29
  • 打赏
  • 举报
回复
关注
老之 2008-07-29
  • 打赏
  • 举报
回复
不知道你要实现什么功能,所以都不好回答。
Application.Handle应用程序句柄,实际上是一个窗口句柄,创建过程是这么一句:

FHandle := CreateWindow(WindowClass.lpszClassName, PChar(FTitle),
WS_POPUP or WS_CAPTION or WS_CLIPSIBLINGS or WS_SYSMENU
or WS_MINIMIZEBOX,
GetSystemMetrics(SM_CXSCREEN) div 2,
GetSystemMetrics(SM_CYSCREEN) div 2,
0, 0, 0, 0, HInstance, nil);

你的是无窗口(Console)程序,并没有创建窗口,无法使用它来取到句柄。
而它也不是主窗口句柄,Application.MainForm.Handle才是主窗口句柄。

进程句柄和窗口句柄是完全不同的。如果GetCurrentProcess取不到,用GetCurrentProcessId取进程Id,再用OpenProcess取句柄
kampan 2008-07-28
  • 打赏
  • 举报
回复
路过关注
lanjian 2008-07-28
  • 打赏
  • 举报
回复
我现在程序已经小了,但我要取应用程序的句柄,不是说要把程序做小。
gyk120 2008-07-28
  • 打赏
  • 举报
回复
《Delphi源代码分析》第一章就是讲最小化内核的,楼主可以去找本电子书看看
yyu423 2008-07-28
  • 打赏
  • 举报
回复
建议你看一下DELPHI源码分析.那里首页就讲了 hello word的最小程序.
lanjian 2008-07-28
  • 打赏
  • 举报
回复
to liangqingzhi :
GetCurrentProcess取到的值和Application.Handle值是不一样的?Application.Handle是主窗口的句柄吗?有时候GetCurrentProcess取到期是-1或0是怎么回事?
老之 2008-07-28
  • 打赏
  • 举报
回复
GetCurrentProcess
gyk120 2008-07-28
  • 打赏
  • 举报
回复
为什么必须要取到句柄呢?换一种方式不行吗?
无窗口的话,ClassName类名总有吧?应该可以用FindWindow来查找
cccc813 2008-07-28
  • 打赏
  • 举报
回复
见http://www.delphibbs.com/keylife/iblog_show.asp?xid=523:
application.handle是程序在TaskBar上的窗体的句柄

1,183

社区成员

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

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