我想发送一条记录,现在只有一个字符串,但我会添加更多的变量.这是我第一次使用记录,所以这可能是一个愚蠢的问题.但是,为什么这样做:
type
TDataPipe = record
WindowTitle: String[255];
end;
var
Data: TDataPipe;
copyDataStruct : TCopyDataStruct;
begin
Data.WindowTitle:= String(PChar(HookedMessage.lParam));
copyDataStruct.dwData := 0;
copyDataStruct.cbData := SizeOf(Data);
copyDataStruct.lpData := @Data;
SendMessage(FindWindow('TForm1', nil), WM_COPYDATA, Integer(hInstance), Integer(@copyDataStruct));
end;
Run Code Online (Sandbox Code Playgroud)
接收方:
type
TDataPipe = record
WindowTitle: String[255];
end;
procedure TForm1.WMCopyData(var Msg: TWMCopyData);
var
sampleRecord : TDataPipe;
begin
sampleRecord.WindowTitle:= TDataPipe(Msg.CopyDataStruct.lpData^).WindowTitle;
Memo1.Lines.Add(sampleRecord.WindowTitle);
end;
Run Code Online (Sandbox Code Playgroud)
为什么如果在记录中,我使用:
WindowTitle: String; //removed the fixed size
Run Code Online (Sandbox Code Playgroud)
在发送方面我使用:
Data.WindowTitle:= PChar(HookedMessage.lParam); //removed String()
Run Code Online (Sandbox Code Playgroud)
它根本不去?
我得到访问冲突/ app冻结...
场景是:发送端是一个使用SetWindowsHookEx挂钩的DLL,接收端加载/调用SetWindowsHookEx的简单exe ...
使用 Microsoft Spy++,当您打开/创建新文档时,我看到 Notepad++ 收到 WM_SETTEXT 消息。我需要在 Windows 上挂钩标题更改,因此我尝试执行 WH_GETMESSAGE 挂钩,并仅过滤 WM_SETTEXT。但到目前为止我还没有成功。这是我的 DLL:
uses
System.SysUtils,
Windows,
Messages,
System.Classes;
var
CurrentHook: HHOOK;
{$R *.res}
function GetMessageHookProc(Code: Integer; iWParam: WPARAM; iLParam: LPARAM): LRESULT; stdcall;
begin
Result:= CallNextHookEx(CurrentHook, Code, iWParam, iLParam);
if (Code = HC_ACTION) and (PMSG(iLParam).message = wm_settext) then
begin
MessageBox(0, 'WM_SETTEXT', 'WM_SETTEXT', MB_OK);
//this code below is just a prototype to what I will try when this works:
if IntToStr(PMSG(iLParam).lParam) = 'new - Notepad++' then
MessageBox(0, 'Notepad++', 'Notepad++', MB_OK);
end;
end; …Run Code Online (Sandbox Code Playgroud)