一个程序的两个实例间要通信,使用的是自定义消息,为了使这个消息有唯一性使用了RegisterWindowMessage()函数。现在碰到一个问题:怎样写消息处理函数。
我一开始是这么写的,连编译都通不过
procedure WMProcess(Message: TMessage); message RegisterWindowMessage('aString');
请各位高手指教!

解决方案 »

  1.   

    超级猛料.chm
        
    如何向指定程序发送消息如何向指定程序发送消息(并不是网络的发送)。需要用到 RegisterWindowMessage、SendMessage吗?又怎样用?请尽可能举例!谢谢 回复贴子:回复人:PoolD(2000-8-13 1:04:00) 得150分发送者:varSendText: string;SendDataStruct: CopyDataStruct;beginSendText := '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);varReceieveData : CopyDataStruct;temp: pchar;ReceieveStr : string;beginReceieveData := 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));出现错误&brvbar;光标停在上面那处,出现[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;usesSysUtils,Classes,hkproc in 'hkproc.pas';exports EnableHotKeyHook,DisableHotKeyHook;beginhNextHookProc:=0;procSaveExit:=ExitProc;end.***************************************************unit hkproc;interfaceuses Windows,Messages,Dialogs,SysUtils,ShellAPI;varintMainHWND: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;implementationfunction 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;//消息类型beginresult:=0;if iCode<0 thenbeginResult:=CallNextHookEx(hNextHookProc,iCode,wParam,lParam);exit;end;//判断CLASSNAME 与 WND 所用的 LPPOINT 是不,同的。GetCursorPos(lpPoint);hwnd:=WindowFromPoint(lpPoint);//读取鼠标指向的控制句柄SetLength(strClassName,255+2);GetClassName(hwnd,PChar(strClassName),255);//读取句柄的名字strClassName:=UpperCase(strClassName);lpPoint.x :=LOWORD(lParam);//读取鼠标的X标lpPoint.y :=HIWORD(lParam);//读取鼠标的Y标hwnd:=WindowFromPoint(lpPoint);//读取鼠标指向的控制句柄strTrayClassName:='SHELL_TRAYWND';//任务栏if Copy(strClassName,1,length(strTrayClassName))=strTrayClassName thenif hwnd=Shell_TrayWnd thenbeginif (wparam=WM_NCRBUTTONUP) or (wparam=WM_NCLBUTTONDOWN) thenbeginResult:=1;exit;end;end;{if WND}strTrayClassName:='SYSTABCONTROL';//任务栏if Copy(strClassName,1,length(strTrayClassName))=strTrayClassName then exit;strTrayClassName:='TRAYNOTIFYWND';//页if Copy(strClassName,1,length(strTrayClassName))=strTrayClassName thenbeginif (wparam=WM_RBUTTONUP) thenbeginhwnd:=GetParent(GetParent(GetParent(hWnd)));if hWnd=Shell_TrayWnd then Result:=1;end;end;strTrayClassName:='BUTTON';//开始按钮if Copy(strClassName,1,length(strTrayClassName))=strTrayClassName thenbeginhwnd:=GetParent(hWnd);if hWnd=Shell_TrayWnd thenbeginif (wparam=WM_RBUTTONUP) or (wparam=WM_LBUTTONDOWN) then Result:=1;if wparam=WM_LBUTTONUP thenbeginSendText := 'Send';SendDataStruct.lpData := @SendText[1];SendDataStruct.cbData := length(Sendtext);//***************** * * * * 当按下开始按钮时发送信息。SendMessage(intMainHWND, WM_CopyData,0, lparam(@SendDataStruct));//***************** * * * *end;exit;end;{if hwnd}end;strTrayClassName:='REBARWINDOW';//页if Copy(strClassName,1,length(strTrayClassName))=strTrayClassName thenbeginif (wparam=WM_RBUTTONUP) or (wparam=WM_LBUTTONDOWN) thenbeginhwnd:=GetParent(hWnd);if hWnd=Shell_TrayWnd then Result:=1;end;end;strTrayClassName:='TOOLBARWINDOW';//工具栏if Copy(strClassName,1,length(strTrayClassName))=strTrayClassName thenbeginif (wparam=WM_LBUTTONDOWN) or (wparam=WM_RBUTTONUP) or (wparam=WM_RBUTTONDOWN) thenbeginhwnd:=GetParent(GetParent(hWnd));if hWnd=Shell_TrayWnd then Result:=1;end;end;end;function EnableHotKeyHook(MainProgramHWND:longint):Bool;export;beginintMainHWND:=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;beginif hNextHookPRoc<>0 thenbeginUnhookWindowsHookEx(hNextHookProc);hNextHookProc:=0;MessageBeep(0);end;Result:=hNextHookProc=0;end;procedure HotKeyHookExit;beginif 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