-
2011. 6. 3. 12:45 Tutorials/IDE]Delphi 7.2
델파이 에서 번거로운 작업 없이 다른 프로세스로부터 간단히 메세지를 받을 수 있습니다.
한번에 전달 할수 있는 값이많지 않음으로, ReadProcessMemory, WriteProcessMemory 를 사용하여,
추가적인 구조체 및 데이터 전달을 할때 매우 큰 자료를 다룰 수 있음으로 참고 하시기 바랍니다.
우선 메세지를 받기 위해 winMSG, winMSG2 를 폼클래스에 등록, 프로시저를 생성 해주게 됩니다.
이제 해당 윈도우로 메세지를 받게 될때, 프로시저로 메세지가 전달 됩니다.
3개의 버튼에 각각 코드를 체워 넣었습니다.
폼이름.Perform 으로 현재프로세스의 윈도우에 메세지를 보내줄수 있고
SendMessage 를 이용하여 다른 창으로 메세지를 전달 해줄수도 있습니다.
크기가 큰 데이터 전송은
WriteProcessMemory 및 ReadProcessMemory 함수를 사용하여 구조체의 포인터를 각각 프로세스에 두고
크기만큼 메모리를 복사 하면 됩니다.
한번에 전달 할수 있는 값이많지 않음으로, ReadProcessMemory, WriteProcessMemory 를 사용하여,
추가적인 구조체 및 데이터 전달을 할때 매우 큰 자료를 다룰 수 있음으로 참고 하시기 바랍니다.
우선 메세지를 받기 위해 winMSG, winMSG2 를 폼클래스에 등록, 프로시저를 생성 해주게 됩니다.
이제 해당 윈도우로 메세지를 받게 될때, 프로시저로 메세지가 전달 됩니다.
type
TMainForm = class(TForm)
SpeedButton1: TSpeedButton;
SpeedButton2: TSpeedButton;
SpeedButton3: TSpeedButton;
Memo1: TMemo;
procedure SpeedButton1Click(Sender: TObject);
procedure SpeedButton2Click(Sender: TObject);
procedure SpeedButton3Click(Sender: TObject);
private
{ Private declarations }
{ WM_USER 메세지 이벤트 핸들러 }
procedure winMSG(var msg:TMessage); message WM_USER;
{ WM_USER+1 메세지 이벤트 핸들러 }
procedure winMSG2(var msg:TMessage); message WM_USER+1;
public
{ Public declarations }
end;
TMainForm = class(TForm)
SpeedButton1: TSpeedButton;
SpeedButton2: TSpeedButton;
SpeedButton3: TSpeedButton;
Memo1: TMemo;
procedure SpeedButton1Click(Sender: TObject);
procedure SpeedButton2Click(Sender: TObject);
procedure SpeedButton3Click(Sender: TObject);
private
{ Private declarations }
{ WM_USER 메세지 이벤트 핸들러 }
procedure winMSG(var msg:TMessage); message WM_USER;
{ WM_USER+1 메세지 이벤트 핸들러 }
procedure winMSG2(var msg:TMessage); message WM_USER+1;
public
{ Public declarations }
end;
3개의 버튼에 각각 코드를 체워 넣었습니다.
폼이름.Perform 으로 현재프로세스의 윈도우에 메세지를 보내줄수 있고
SendMessage 를 이용하여 다른 창으로 메세지를 전달 해줄수도 있습니다.
크기가 큰 데이터 전송은
WriteProcessMemory 및 ReadProcessMemory 함수를 사용하여 구조체의 포인터를 각각 프로세스에 두고
크기만큼 메모리를 복사 하면 됩니다.
procedure
TMainForm.winMSG(var msg:TMessage);begin
{ WParam , LParam 받기 }
Memo1.Lines.Add( 'winMSG : ' + IntToStr(msg.WParam) + ' ' + IntToStr(msg.LParam) );
{ 결과 반환 }
msg.Result := msg.WParam;
end;
procedure TMainForm.winMSG2(var msg:TMessage);begin
{ WParam , LParam 받기 }
Memo1.Lines.Add( 'winMSG2 : ' + IntToStr(msg.WParam) + ' ' + IntToStr(msg.LParam) );
{ 결과 반환 High|Low 2바이트씩 나누어 반환 }
msg.ResultLo := msg.WParamLo;
msg.ResultHi := msg.LParamLo;
end;
procedure TMainForm.SpeedButton1Click(Sender: TObject);
var ret:Integer;begin//메세지 전송
ret := Self.Perform(WM_USER, 100, 200);
end;
procedure TMainForm.SpeedButton2Click(Sender: TObject);
var ret:Integer;begin//메세지 전송
ret := Self.Perform(WM_USER, 100, 0);
end;
procedure TMainForm.SpeedButton3Click(Sender: TObject);
var ret:Integer;begin//다른 윈도우로 메세지 전송
ret := SendMessage(Self.Handle, WM_USER+1, 100, 200);
{
2바이트 Low = Word(ret)
2바이트 High = HiWord(ret)
}
end;
{ WParam , LParam 받기 }
Memo1.Lines.Add( 'winMSG : ' + IntToStr(msg.WParam) + ' ' + IntToStr(msg.LParam) );
{ 결과 반환 }
msg.Result := msg.WParam;
end;
procedure TMainForm.winMSG2(var msg:TMessage);begin
{ WParam , LParam 받기 }
Memo1.Lines.Add( 'winMSG2 : ' + IntToStr(msg.WParam) + ' ' + IntToStr(msg.LParam) );
{ 결과 반환 High|Low 2바이트씩 나누어 반환 }
msg.ResultLo := msg.WParamLo;
msg.ResultHi := msg.LParamLo;
end;
procedure TMainForm.SpeedButton1Click(Sender: TObject);
var ret:Integer;begin//메세지 전송
ret := Self.Perform(WM_USER, 100, 200);
end;
procedure TMainForm.SpeedButton2Click(Sender: TObject);
var ret:Integer;begin//메세지 전송
ret := Self.Perform(WM_USER, 100, 0);
end;
procedure TMainForm.SpeedButton3Click(Sender: TObject);
var ret:Integer;begin//다른 윈도우로 메세지 전송
ret := SendMessage(Self.Handle, WM_USER+1, 100, 200);
{
2바이트 Low = Word(ret)
2바이트 High = HiWord(ret)
}
end;