在MSDN里找一个叫做toolhelp的东西
其实挺简单的win9x win2000 win XP都支持,但NT4要用另外的方法

解决方案 »

  1.   

    找Handle与Path和Name好像关系不大,有几种函数可以找Handle。HWND FindWindow(
      LPCTSTR lpClassName,  // class name
      LPCTSTR lpWindowName  // window name
    );BOOL EnumWindows(
      WNDENUMPROC lpEnumFunc,  // callback function
      LPARAM lParam            // application-defined value
    );
      

  2.   

    请问chechy(chechy)兄台:
      1.这两个函数有什么区别????
      2.我想解决两个独立应用程序(都是自己的)之间的通讯和数据传输问题,两位大哥可否给点意见???需要用到内存共享技术码????
      
      

  3.   

    第一个比较合适,第二个可以将Windows中所有的Handle都能取得。具体查看MSDN。
    两个程序之间的通讯,可以通过以下方法:
    1、通过发送消息完成。
    2、通过内存共享完成。
    3、通过Ole Automation完成。
    可以任选一种。
      

  4.   

    还是chechy(chechy) 讲的好!!!完全康复了吧?以后还请多多指教!
      

  5.   

    chechy(chechy) 
    不错啊
    我也知道但是不能说的这么好
    呵呵
      

  6.   

    真是太谢谢chechy(chechy)了!!!!
    小弟再多问一句:在内存共享方面我应该注意点什么????
    繁劳兄台再指点一二!!!!!
      

  7.   

    我一般都是使用OLE AUTOMATION完成数据交换的,对内存共享不是非常熟悉。
    不过我知道,Delphi5开发人员指南关于DLL一章中,有内存共享的例子,是通过Memory Map File实现的。你可以参考那本书。
      

  8.   

    unit Unit1; 
     
    interface 
     
    uses 
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
      Dialogs, Tlhelp32, StdCtrls, Buttons, CheckLst; 
     
    type 
      TForm1 = class(TForm) 
        BitBtn1: TBitBtn; 
        ListBox1: TListBox; 
        Button1: TButton; 
        procedure BitBtn1Click(Sender: TObject); 
        procedure Button1Click(Sender: TObject); 
      private 
        { Private declarations } 
      public 
        { Public declarations } 
      end; 
     
    var 
      Form1: TForm1; 
     
    procedure Search(Strings:TStrings); 
    implementation 
     
    {$R *.dfm} 
    procedure Search(Strings:TStrings); 
    var 
      Snap:THandle; 
      RB:Boolean; 
      PE:TProcessEntry32; 
    begin 
      if Strings=nil then 
        Exit; 
      snap:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); 
      if snap = -1 then Exit; 
      try 
        PE.dwSize:=SizeOf(TProcessEntry32); 
        RB:=Process32First(snap,PE); 
        while RB do 
        begin 
          Strings.AddObject(PE.szExeFile,Pointer(PE.th32ProcessID)); 
          PE.dwSize:=SizeOf(TProcessEntry32); 
          RB:=Process32Next(snap,PE); 
        end; 
      finally 
        CloseHandle(snap); 
      end; 
    end; 
    procedure TForm1.BitBtn1Click(Sender: TObject); 
    begin 
      ListBox1.Items.Clear; 
      Search(ListBox1.Items); 
    end; 
     
    procedure TForm1.Button1Click(Sender: TObject); 
    var 
      H:THandle; 
      R:Cardinal; 
    begin 
      H:=OpenProcess(PROCESS_TERMINATE,True,LongInt(ListBox1.Items.Objects[ListBox1.ItemIndex])); 
      R:=0; 
      TerminateProcess(H,R); 
      CloseHandle(H); 
    end; 
     
    end. 
    关键的: 
    procedure TForm1.Button1Click(Sender: TObject); 
    var 
      H:THandle; 
      R:Cardinal; 
    begin 
      H:=OpenProcess(PROCESS_TERMINATE,True,LongInt(ListBox1.Items.Objects[ListBox1.ItemIndex])); 
      R:=0; 
      TerminateProcess(H,R); 
      CloseHandle(H); 
    end; 
    其中ListBox1.Items.Objects[ListBox1.ItemIndex]是在遍历进程时存放的ProcessID
      

  9.   

    哇!!!谢谢chechy(chechy):以后希望兄台多多指点。----a9a9a9佩服的说...
    先加分是真的!!!!!
    小弟的email:[email protected]
    目前公司的lan不支持qq,以后如果我有什么项目可以合作合作吗????
      

  10.   

    请问cobi(我是小新):TForm1.Button1Click在做什么???
      

  11.   

    chechy(chechy):
    可否给段使用OLE AUTOMATION完成数据交换的代码???借鉴一下????
      

  12.   

    我怎么觉得上面全是一群笨蛋呀!
    很简单嘛,用WINDOWS的API函数:
    HWND GetWindow(    HWND hWnd, // handle of original window
        UINT uCmd  // relationship flag
       );
    详细你们可以查看Delphi的API帮助.
      

  13.   

    To erp2(天涯劍):
    我是笨,不过你也聪明不到哪里去。另外一个程序的Window和该程序的Window之间没有固定的关系,如果调用GetWindow?
    下次您要是想骂人,先看看自己有什么漏洞,别让别人逮着了。
      

  14.   

    小新方法才是正解,就是我说的toolhelp了
      

  15.   

    to:erp2(天涯劍)-----egg2(天涯劍)  :)
       教教你吧"笨蛋"!!!    函数功能:该函数返回与指定窗口有特定关系(如Z序或所有者)的窗口句柄。    函数原型:HWND GetWindow(HWND hWnd,UNIT nCmd);    参数:    hWnd:窗口句柄。要获得的窗口句柄是依据nCmd参数值相对于这个窗口的句柄。    nCmd:说明指定窗口与要获得句柄的窗口之间的关系。该参数值可以是下列之一:    GW_CHILD:如果指定窗口是父窗口,则获得的是在Z序顶端的子窗口的句柄,否则为NULL。函数仅检查指定父窗口的子窗口,不检查继承窗口。    GW_ENABLEDPOUP:(WindowsNT 5.0)返回的句柄标识了属于指定窗口的处于使能状态弹出式窗口(检索使用第一个由GW_HWNDNEXT 查找到的满足前述条件的窗口);如果无使能窗口,则获得的句柄与指定窗口相同。    GW_HWNDFIRST:返回的句柄标识了在Z序最高端的相同类型的窗口。如果指定窗口是最高端窗口,则该句柄标识了在Z序最高端的最高端窗口;如果指定窗口是顶层窗口,则该句柄标识了在z序最高端的顶层窗口:如果指定窗口是子窗口,则句柄标识了在Z序最高端的同属窗口。    GW_HWNDLAST:返回的句柄标识了在z序最低端的相同类型的窗口。如果指定窗口是最高端窗口,则该柄标识了在z序最低端的最高端窗口:如果指定窗口是顶层窗口,则该句柄标识了在z序最低端的顶层窗口;如果指定窗口是子窗口,则句柄标识了在Z序最低端的同属窗口。    GW_HWNDNEXT:返回的句柄标识了在Z序中指定窗口下的相同类型的窗口。如果指定窗口是最高端窗口,则该句柄标识了在指定窗口下的最高端窗口:如果指定窗口是顶层窗口,则该句柄标识了在指定窗口下的顶层窗口;如果指定窗口是子窗口,则句柄标识了在指定窗口下的同属窗口。    GW HWNDPREV:返回的句柄标识了在Z序中指定窗口上的相同类型的窗口。如果指定窗口是最高端窗口,则该句柄标识了在指定窗口上的最高端窗口;如果指定窗口是顶层窗口,则该句柄标识了在指定窗口上的顶层窗口;如果指定窗口是子窗口,则句柄标识了在指定窗口上的同属窗口。    GW_OWNER:返回的句柄标识了指定窗口的所有者窗口(如果存在)。    返回值:如果函数成功,返回值为窗口句柄;如果与指定窗口有特定关系的窗口不存在,则返回值为NULL。    若想获得更多错误信息,请调用GetLastError函数。    备注:在循环体中调用函数EnumChildWindow比调用GetWindow函数可靠。调用GetWindow函数实现该任务的应用程序可能会陷入死循环或退回一个已被销毁的窗口句柄。    速查:Windows NT:3.1以上版本;Windows:95以上版本;Windows CE:1.0以上版本;头文件:winuser.h;库文件:user32.lib。email已收到,谢谢checky!!!!!!
    chechy(chechy)咱不理他!!
      

  16.   

    不过toolhelp好象没那么复杂压,他的代码里好象有很多多余的东西。
    最关键的就是procedure Search那段
      

  17.   

    请大家搜一下和erp2(天涯劍)有关的贴子,看看这是个…
    http://www.csdn.net/Expert/topic/522/522041.shtm