delphi 句柄?

2024-05-15 05:02

1. delphi 句柄?

所谓句柄实际上是一个数据,是一个Long (整长型)的数据。 

句柄是WONDOWS用来标识被应用程序所建立或使用的对象的唯一整数,WINDOWS使用各种各样的句柄标识诸如应用程序实例,窗口,控制,位图,GDI对象等等。
WINDOWS句柄有点象C语言中的文件句柄。 
从上面的定义中的我们可以看到,句柄是一个标识符,是拿来标识对象或者项目的,它就象我们的姓名一样,每个人都会有一个,不同的人的姓名不一样,但是,也可能有一个名字和你一样的人。从数据类型上来看它只是一个16位的无符号整数。应用程序几乎总是通过调用一个WINDOWS函数来获得一个句柄,之后其他的WINDOWS函数就可以使用该句柄,以引用相应的对象。 

如果想更透彻一点地认识句柄,我可以告诉大家,句柄是一种指向指针的指针。我们知道,所谓指针是一种内存地址。应用程序启动后,组成这个程序的各对象是住留在内存的。如果简单地理解,似乎我们只要获知这个内存的首地址,那么就可以随时用这个地址访问对象。但是,如果您真的这样认为,那么您就大错特错了。我们知道,Windows是一个以虚拟内存为基础的操作系统。在这种系统环境下,Windows内存管理器经常在内存中来回移动对象,依此来满足各种应用程序的内存需要。对象被移动意味着它的地址变化了。如果地址总是如此变化,我们该到哪里去找该对象呢? 

为了解决这个问题,Windows操作系统为各应用程序腾出一些内存储地址,用来专门登记各应用对象在内存中的地址变化,而这个地址(存储单元的位置)本身是不变的。Windows内存管理器在移动对象在内存中的位置后,把对象新的地址告知这个句柄地址来保存。这样我们只需记住这个句柄地址就可以间接地知道对象具体在内存中的哪个位置。这个地址是在对象装载(Load)时由系统分配给的,当系统卸载时(Unload)又释放给系统。 

句柄地址(稳定)→记载着对象在内存中的地址————→对象在内存中的地址(不稳定)→实际对象 

本质:WINDOWS程序中并不是用物理地址来标识一个内存块,文件,任务或动态装入模块的,相反的,WINDOWS API给这些项目分配确定的句柄,并将句柄返回给应用程序,然后通过句柄来进行操作。 

但是必须注意的是程序每次从新启动,系统不能保证分配给这个程序的句柄还是原来的那个句柄,而且绝大多数情况的确不一样的。假如我们把进入电影院看电影看成是一个应用程序的启动运行,那么系统给应用程序分配的句柄总是不一样,这和每次电影院售给我们的门票总是不同的一个座位是一样的道理。

delphi 句柄?

2. delphi 中,句柄到底是什么概念阿?


3. delphi 句柄和回调函数

你说刚学语言,可是问的都是些挺难的问题啊。
1 formatdrive(hwnd:Hwnd;drive,fomatid,options:word)
hwnd=被显示对话框的父窗口
drive=被格式化的驱动器ID(0=A,1=B,2=C,等)
fmtID=应该总是设置为-1 
Options=格式化的类型

就是说当你要格式化一个磁盘的时候,系统要问你是否确实这样做,这时就要弹出一个提示对话框,但是对话框需要消息循环啊,获得焦点啊等等很多的东西支撑,所以这个对话框需要一个父窗口作为依靠,你可以把他设为你的程序的主窗口的句柄就可以了。

GetWindowRect(hwnd:HWND;var lpRect:TRect)
获得一个窗体的外轮廓的大小尺寸,既然要得到尺寸,当然首先得告诉程序,你想获得那个窗口,就得把那个窗口的句柄传给它。

这个hwnd和上一个hwnd是指一个吗?hwnd是一个数据类型,是一个无符号的32位整数,就是窗体的句柄,你可以把任何窗体的句柄作为参数传入函数中,这样程序就会用这个窗体为他服务或者返回窗体的参数。

2.stdcall是什么意思?是一种函数的调用方式声明,简单的说,用delphi写的函数跟用其他语言写的函数调用方式不一样(例如主要以C编写的系统API函数),主要是参数的输入顺序是不一样的,还有调用完毕后清理内存垃圾的问题,如果用delphi语言去调用一个系统的函数,而不告诉DELPHI这个函数得按stdcall的调用方式,那个调用就会出错。由于你上面所写的两个函数是系统API函数或者从API演变来的,所以必须加上这个标记才行。

3,EmumSystemProcess(LbxList.Items,Mynum);Mynum后面应该放参数啊
在delphi里面,函数的名称也可以作为是一个变量,这个变量是个指针,指向函数的开始位置,在回调函数中,一个特殊的地方就是函数的变量不能直接输入,而得靠EnumWindows(@Epro,integer(list));这样输入,@Epro是回调函数的地址,integer(list)是回调函数的变量,然后由EnumWindows把这个函数推给操作系统作历遍运行。

不知说的懂不懂,关键是你问的这些都太深了,得有了一定基础以后才明白。

delphi 句柄和回调函数

4. delphi传递窗口句柄的问题

和这些都没有关系。

发出你的ReadInit代码出来。

肯定是你对某个数值做了写操作后出现的。

5. delphi传递窗口句柄的问题,请帮忙!

是你的句柄取错了
重新检查次吧

delphi传递窗口句柄的问题,请帮忙!

6. delphi中句柄问题

那是因为你在delphi的编辑器里开着了,

findwindows找到的是delphi平台中你的设计窗体,关了对应的unit2.pas

7. Delphi取所有窗口句柄

定义一个全局变量
var
 handlelist: tstringlist;


procedure TForm1.Button1Click(Sender: TObject);

 function GetProcessExePath(h: HWND): BOOL; stdcall;
  function getfilename(str: string): string;
  begin
   result := UpperCase(ExtractFileName(str));
  end;
 var
  pid: Cardinal;
  pHandle: THandle;
  buf: array[0..MAX_PATH] of Char;
  str: string;
 begin
  GetWindowThreadProcessId(h, @pid);
  pHandle := OpenProcess(PROCESS_ALL_ACCESS, False, pid);
  GetModuleFileNameEx(pHandle, 0, buf, Length(buf));
  CloseHandle(pHandle);
  str := StrPas(buf);
   handlelist.Add(IntTostr(h)+str);//句柄加文件路径
  Result := True;
 end;
var
 i: integer;
begin  
 if form1.OpenDialog1.Execute then
  begin
   Edit1.Text := OpenDialog1.FileName;
   EnumWindows(@getprocessexepath, 0);
   for i := 0 to handlelist.count - 1 do
listbox1.items.add(handlelist.string[i]);   
end;
end;

Delphi取所有窗口句柄

8. delphi 获取自身句柄

自身句柄:self.handle;
根据PID获得句柄:
    
  GetWindow(hWnd,pID);//pID就是进程ID   hWnd是窗口句柄
最新文章
热门文章
推荐阅读