如何向指定程序发送消息
如何向指定程序发送消息(并不是网络的发送)。需要用到 RegisterWindowMessage、SendMessage吗?又怎样用?请尽可能举例!谢谢
回复贴子:
回复人:PoolD(2000-8-13 1:04:00) 得150分
发送者:
var
SendText: string;
SendDataStruct: CopyDataStruct;
begin
SendText := 'Send';
SendDataStruct.cbData := length(Sendtext);
SendDataStruct.lpData := @SendText[1];
SendMessage(FindWindow(PCHAR('TForm1'), PCHAR('form1')), WM_CopyData, Application.Handle, lparam(@SendDataStruct));
end;
接收者:
procedure DataIn(var DataMessage: TWMCopyData); message wm_copydata;
procedure DataIn(var DataMessage: TWMCopyData);
var
ReceieveData : CopyDataStruct;
temp: pchar;
ReceieveStr : string;
begin
ReceieveData := DataMessage.CopyDataStruct^;
temp := ReceieveData.lpdata;
ReceieveStr := string(temp);
end;
回复人:xiaohuilau(2000-8-13 11:17:00) 得0分
PoolD:
我照你的方法做但会在SendMessage(FindWindow(PCHAR('TForm1'), PCHAR('form1')), WM_CopyData, Application.Handle, lparam(@SendDataStruct));出现错误
|
光标停在上面那处,出现[Error] hkproc.pas(72): Missing operator or semicolon错误
请教请教,万分感谢!
回复人:xiaohuilau(2000-8-13 11:19:00) 得0分
PoolD:
我照你的方法做但会在SendMessage(FindWindow(PCHAR('TForm1'), PCHAR('form1')), WM_CopyData, Application.Handle, lparam(@SendDataStruct));出现错误
¦
光标停在上面那处,出现[Error] hkproc.pas(72): Missing operator or semicolon错误
请教请教,万分感谢!
回复人:xiaohuilau(2000-8-13 11:20:00) 得0分
PoolD:
我照你的方法做但会在SendMessage(FindWindow(PCHAR('TForm1'), PCHAR('form1')), WM_CopyData, Application.Handle, lparam(@SendDataStruct));出现错误
光标停在'(@'那处,出现[Error] hkproc.pas(72): Missing operator or semicolon错误
请教请教,万分感谢!
回复人:xiaohuilau(2000-8-13 12:58:00) 得0分
PoolD:
**************
我试过了你的程序,在Form里测试是没有问题的。出现上面的错误原因系我把发送者放在 DLL 里。请问如何解决?
**************
谢谢
回复人:PoolD(2000-8-13 13:21:00) 得0分
to xiaohuilau:
试一下把Application.Handle改成0。
回复人:xiaohuilau(2000-8-13 18:49:00) 得0分
PoolD:
我照你的方法做但会在SendMessage(FindWindow(PCHAR('TForm1'), PCHAR('form1')), WM_CopyData, 0,lparam(@SendDataStruct));出现错误
光标停在** 'lparam(@sendDataStruct' **那处,出现[Error] hkproc.pas(72): Missing operator or semicolon错误
请教请教,万分感谢!
为了感谢你的帮助,我将分数加到了 150 分。
回复人:PoolD(2000-8-13 19:05:00) 得0分
to xiaohuilau
这段代码我试过,编译可以通过。我的一个程序就是用这种方法发送信息的。
是否可以把你写的这部分代码发给我看一下?
分数倒无所谓,重要的是解决问题。^_^
回复人:xiaohuilau(2000-8-13 19:11:00) 得0分
PoolD:我的代码如下
library hk;
uses
SysUtils,
Classes,
hkproc in 'hkproc.pas';
exports EnableHotKeyHook, DisableHotKeyHook;
begin
hNextHookProc := 0;
procSaveExit := ExitProc;
end. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
unit hkproc;
interface
uses Windows, Messages, Dialogs, SysUtils, ShellAPI;
var
intMainHWND: Longint;
Shell_TrayWnd: Longint;
CtrlDown: Boolean;
hNextHookProc: HHook;
procSaveExit: Pointer;
function KHH(iCode: integer; wParam: wParam; lParam: lParam): LRESULT; stdcall; export;
function EnableHotKeyHook(MainProgramHWND: Longint): Bool; export;
function DisableHotKeyHook: Bool; Export;
implementation
function KHH(iCode: integer; wParam: wParam; lParam: lParam): LRESULT; stdcall; export;
const
_Keypressmask = $80000000;
var
lpPoint: TPoint;
hwnd: Longint;
strClassName, strTrayClassName: String;
SendText: string;
SendDataStruct: CopyDataStruct;
begin
result := 0;
if iCode < 0 then
begin
result := CallNextHookEx(hNextHookProc, iCode, wParam, lParam);
exit;
end;
GetCursorPos(lpPoint);
hwnd := WindowFromPoint(lpPoint);
SetLength(strClassName, 255 + 2);
GetClassName(hwnd, PChar(strClassName), 255);
strClassName := UpperCase(strClassName);
lpPoint.x := LOWORD(lParam);
lpPoint.y := HIWORD(lParam);
hwnd := WindowFromPoint(lpPoint);
strTrayClassName := 'SHELL_TRAYWND';
if Copy(strClassName, 1, length(strTrayClassName)) = strTrayClassName then
if hwnd = Shell_TrayWnd then
begin
if (wParam = WM_NCRBUTTONUP) or (wParam = WM_NCLBUTTONDOWN) then
begin
result := 1;
exit;
end;
end;
strTrayClassName := 'SYSTABCONTROL';
if Copy(strClassName, 1, length(strTrayClassName)) = strTrayClassName then
exit;
strTrayClassName := 'TRAYNOTIFYWND';
if Copy(strClassName, 1, length(strTrayClassName)) = strTrayClassName then
begin
if (wParam = WM_RBUTTONUP) then
begin
hwnd := GetParent(GetParent(GetParent(hwnd)));
if hwnd = Shell_TrayWnd then
result := 1;
end;
end;
strTrayClassName := 'BUTTON';
if Copy(strClassName, 1, length(strTrayClassName)) = strTrayClassName then
begin
hwnd := GetParent(hwnd);
if hwnd = Shell_TrayWnd then
begin
if (wParam = WM_RBUTTONUP) or (wParam = WM_LBUTTONDOWN) then
result := 1;
if wParam = WM_LBUTTONUP then
begin
SendText := 'Send';
SendDataStruct.lpData := @SendText[1];
SendDataStruct.cbData := length(SendText);
SendMessage(intMainHWND, WM_CopyData, 0, lParam(@SendDataStruct));
end;
exit;
end;
end;
strTrayClassName := 'REBARWINDOW';
if Copy(strClassName, 1, length(strTrayClassName)) = strTrayClassName then
begin
if (wParam = WM_RBUTTONUP) or (wParam = WM_LBUTTONDOWN) then
begin
hwnd := GetParent(hwnd);
if hwnd = Shell_TrayWnd then
result := 1;
end;
end;
strTrayClassName := 'TOOLBARWINDOW';
if Copy(strClassName, 1, length(strTrayClassName)) = strTrayClassName then
begin
if (wParam = WM_LBUTTONDOWN) or (wParam = WM_RBUTTONUP) or (wParam = WM_RBUTTONDOWN) then
begin
hwnd := GetParent(GetParent(hwnd));
if hwnd = Shell_TrayWnd then
result := 1;
end;
end;
end;
function EnableHotKeyHook(MainProgramHWND: Longint): Bool; export;
begin
intMainHWND := MainProgramHWND;
Shell_TrayWnd := FindWindow('Shell_TrayWnd', nil);
result := False;
if hNextHookProc <> 0 then
exit;
hNextHookProc := SetWindowsHookEx(WH_MOUSE, KHH, Hinstance, 0);
result := hNextHookProc <> 0;
end;
function DisableHotKeyHook: Bool; export;
begin
if hNextHookProc <> 0 then
begin
UnhookWindowsHookEx(hNextHookProc);
hNextHookProc := 0;
MessageBeep(0);
end;
result := hNextHookProc = 0;
end;
procedure HotKeyHookExit;
begin
if hNextHookProc <> 0 then
DisableHotKeyHook;
end;
end.
回复人:PoolD(2000-8-13 19:50:00) 得0分
function KHH(iCode:integer;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall;export;
定义参数名的时候最好不要用保留字。
参数lParam和lparam(@SendDataStruct)重复了。
回复人:xiaohuilau(2000-8-13 20:28:00) 得0分
非常感谢 PoolD