两个application之间互相通讯 ( 积分: 100 )

  • 主题发起人 主题发起人 网络书生
  • 开始时间 开始时间

网络书生

Unregistered / Unconfirmed
GUEST, unregistred user!
怎么才可以在两个application之间可以互相通讯~!比如在第一个application(自己编的程序)当中向别的exe文件发送消息!让那个exe文件运行我想要让它作的操作!~比如QQ可以简单举的例子吗?
 
怎么才可以在两个application之间可以互相通讯~!比如在第一个application(自己编的程序)当中向别的exe文件发送消息!让那个exe文件运行我想要让它作的操作!~比如QQ可以简单举的例子吗?
 
呵呵,我也正在弄这个,
1.用FindWindow()找到目标程序的窗口Handle。
2.找到需要进行操作的控件的Handle,用SendMessage()方法触发事件。
var FWindowHandle,FButtonWindow:hwnd;

FWindowHandle:=FindWindow('class name','window caption');
FButtonWindow:=FindWindowEx(FWindowHandle,0,'TButton',nil);
class name,window caption可以用spy++得到
SendMessage(FButtonWindow,WM_LBUTTONDOWN,0,0);
SendMessage(FButtonWindow,WM_LBUTTONUP,0,0);
我现在还只能向按纽发送消息,其他控件还没找到方法,希望多交流.
 
消息的话不一定成功的,我自己做的两个程序之间发消息有时候会失败。最好还是写注册表或者内存,不过这个做不到时时通信,只能定时检查了。如果非要时时通信,只能采用发消息,收到消息后返回一个值这样的方法
 
也是消息投递不一定可以收到的!
 
可以用内存共享来实现,
发消息也可以,如果要有具体的数据交换可以发送WM_COPYDATA
 
http://www.delphibbs.com/keylife/iblog_show.asp?xid=13774
 
to ;idonot
用PostMessage,要好一点
 
也可以试试使用DDE
 
postmessage好一点儿,哪个都会有丢的可能,要防止丢信息,可以两个程序相互发握手实现。
 
发送消息,同时握手确认。
 
用RegisterWindowMessage在两个程序启动时注册同一个消息,再用postmessage发送消息就可以通信了,参看MSDN或DELPHI里的WIN32帮助
 
欢乐浪子讲的对,在调用api函数,发送消息.
 
说的是类似物流信息类的管理软件么?
 
要看楼猪怎么个通讯法,如果简单的那种,用sendMessage(handle,user_mesaage,0,0)就行了。如果有数据要交换,因为彼此属于不同的进程,不能相互访问的,这时,你得开个内存映像createFileMapping,定一个特殊的映像名,然后映身到双方,就能彼此交换数据了。给你个方向,具体实现要看你自己.
 
http://www.tommstudio.com/ViewArticles.aspx?ID=766
http://www.tommstudio.com/
 
给QQ窗口发消息
unit FrmUnit;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, CheckLst, ExtCtrls, ComCtrls;
type
TSendFrm = class(TForm)
SendBtn: TButton;
Label1: TLabel;
Memo1: TMemo;
Label2: TLabel;
Memo2: TMemo;
Label3: TLabel;
Edit1: TEdit;
Label4: TLabel;
Edit2: TEdit;
procedure SendBtnClick(Sender: TObject);
procedure FormClose(Sender: TObject;
var Action: TCloseAction);
procedure FormCreate(Sender: TObject);
end;

var
SendFrm: TSendFrm;
NeedLoop: Bool = FALSE;
implementation
{$R *.dfm}
procedure LoopStop(TimeOut: DWORD);
var
StartTick: DWORD;
begin
StartTick := GetTickCount();
repeat
Application.ProcessMessages;
Sleep(1);
until (GetTickCount() - StartTick > TimeOut) or (not NeedLoop);
end;

procedure SendText(hWnd: HWND;
Text: string);
var
hDialog, hButton, hAfxWnd42, hRICHEDIT: DWORD;
J: Integer;
begin
hDialog := FindWindowEx(hWnd, 0, '#32770', nil);
if (hDialog = 0) then
Exit;
hButton := FindWindowEx(hDialog, 0, 'Button', '发送(&S)');
if (hButton = 0) then
Exit;
hAfxWnd42 := 0;
repeat
hAfxWnd42 := FindWindowEx(hDialog, hAfxWnd42, 'AfxWnd42', nil);
if (hAfxWnd42 = 0) then
Exit;
hRICHEDIT := FindWindowEx(hAfxWnd42, 0, 'RICHEDIT', nil);
until (hRICHEDIT <> 0);
J := 1;
while (J <= StrToInt(SendFrm.Edit1.Text)) and (NeedLoop)do
begin
SendMessage(hRICHEDIT, EM_REPLACESEL, 0, Integer(@Text[1]));
SendMessage(hButton, BM_CLICK, 0 , 0);
J := J + 1;
LoopStop(StrToInt(SendFrm.Edit2.Text) * 1000);
end;
end;

function EnumFunc(hWnd: HWND;
lParam: LPARAM): BOOL;
stdcall;
var
Buffer: array[0..50] of Char;
J: Integer;
begin
Result := NeedLoop;
Buffer[GetWindowText(hWnd, Buffer, 50)] := #0;
if (SendFrm.Memo2.Lines.Count = 0) then
begin
if (Pos('聊天中', Buffer) > 0) then
SendText(hWnd, SendFrm.Memo1.Text);
end else
begin
for J := 0 to SendFrm.Memo2.Lines.Countdo
if (Buffer = '与 ' + Trim(SendFrm.Memo2.Lines.Strings[J]) + ' 聊天中') then
SendText(hWnd, SendFrm.Memo1.Text);
end;

end;

procedure TSendFrm.SendBtnClick(Sender: TObject);
begin
if (SendBtn.Caption = '发送') then
begin
SendBtn.Caption := '停止';
NeedLoop := TRUE;
EnumWindows(@EnumFunc, 0);
SendBtn.Caption := '发送';
end else
begin
NeedLoop := FALSE;
end;
end;

procedure TSendFrm.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
NeedLoop := FALSE;
end;

procedure TSendFrm.FormCreate(Sender: TObject);
begin
SetWindowLong(Edit1.Handle, GWL_STYLE, GetWindowLong(Edit1.Handle, GWL_STYLE) or ES_NUMBER);
SetWindowLong(Edit2.Handle, GWL_STYLE, GetWindowLong(Edit2.Handle, GWL_STYLE) or ES_NUMBER);
end;

end.
 
接受答案了.
 
各位对不起!~我操作错误发错分了!~对不起!~
 
后退
顶部