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. 

解决方案 »

  1.   

    使用GetCurrentProcess可以得到当前进程句柄,Application.Handle实际上是调用CreateWindow创建窗口时的返回值(见TApplication.CreateHandle)
      

  2.   

    to liangqingzhi :
      GetCurrentProcess取到的值和Application.Handle值是不一样的?Application.Handle是主窗口的句柄吗?有时候GetCurrentProcess取到期是-1或0是怎么回事?to yuqianyi1974:
      我没有创建窗,请问怎么用FindWindow?
      

  3.   

    to liangqingzhi : 
      GetCurrentProcess取到的值和Application.Handle值是不一样的?Application.Handle是主窗口的句柄吗?有时候GetCurrentProcess取到期是-1或0是怎么回事?
      

  4.   

    创建进程的快照,之后找到‘*.exe’,再怎么怎么样?
      

  5.   

    BroadcastSystemMessage,然后自己处理下消息,
    不知道用的话,搜一下,一大堆现成
      

  6.   

    获得当前工作的窗口,主要是用到这样一个API:GetForegroundWindow(),它返回当前正在工作的窗口的句柄.
    楼主试看。
      

  7.   

    Application本身是一个窗体,只在任务栏显示。
    如果知道窗体文字的话还是可以FindWindow的吧