Вот смотри, что получилось
Add(MainForm,3118620,196,252) { Left=20 Top=105 Width=341 Height=144 } Add(InlineCode,990011,343,245) { EventPoints=#8:Messages|6:WParam|6:LParam| Code=#15:unit HiAsmUnit;|0:|9:interface|0:|29:uses Windows,kol,Share,Debug;|0:|4:type|28: THiAsmClass = class(TDebug)|10: private|17: FWnd:THandle;|9: public|24: Messages:THI_Event;|22: WParam:THI_Event;|27: LParam:THI_Event; |24: constructor Create;|34: destructor Destroy; override;|5: end;|0:|14:implementation|0:|83:function MyWndProc(wnd:THandle; wMsg:cardinal; wParam,lParam:DWORD):DWORD; stdcall;|26:var MySelf: THiAsmClass;|5:begin|57: MySelf := THiAsmClass(GetWindowLong(wnd,GWL_USERDATA));|46: _hi_onEvent(MySelf.WParam, integer(wParam));|48: _hi_onEvent(MySelf.LParam, integer(lParam)); |46: _hi_onEvent(MySelf.Messages, integer(wMsg));|50: Result := DefWindowProc(wnd,wMsg,wParam,lParam);|4:end;|0:|31:constructor THiAsmClass.Create;|5:begin|13: inherited;|114: FWnd := CreateWindow('ReceiveMessages','',{WS_OVERLAPPEDWINDOW or }WS_POPUP, 0, 0, 0, 0, 0, 0, hInstance, nil);|51: SetWindowLong(FWnd,GWL_USERDATA,cardinal(Self));|7:end; |0:|31:destructor THiAsmClass.Destroy;|5:begin|31: Windows.DestroyWindow(FWnd);|13: FWnd := 0;|13: inherited;|4:end;|0:|29:var MyWindowClass: TWndClass;|0:|14:initialization|0:|27: MyWindowClass.style := 0;|42: MyWindowClass.lpfnWndProc := @MyWndProc;|32: MyWindowClass.cbClsExtra := 0;|32: MyWindowClass.cbWndExtra := 0;|39: MyWindowClass.hInstance := hInstance;|27: MyWindowClass.hIcon := 0;|29: MyWindowClass.hCursor := 0;|35: MyWindowClass.hbrBackground := 0;|36: MyWindowClass.lpszMenuName := nil;|51: MyWindowClass.lpszClassName := 'ReceiveMessages';|31: RegisterClass(MyWindowClass);|0:|4:end.| link(Messages,1535947:doCase,[]) link(WParam,11902145:doValue,[(415,258)(415,300)]) link(LParam,13613115:doValue,[(440,265)(440,391)]) } Add(Button,1802014,196,301) { Left=20 Top=20 link(onClick,9300100:doFind,[]) } Add(FindWindow,9300100,259,301) { ClassName="ReceiveMessages" SkipParam=1 link(onFind,705416:doSendMessage,[(303,307)(303,335)(247,335)(247,363)]) } Add(SendMessage,705416,259,357) { Message=1 WParam=123 LParam=456 link(Handle,9300100:Handle,[]) } Add(Case,1535947,399,245) { Value=Integer(1024) DataOnTrue=String(WM_USER) link(onTrue,16042993:doEvent1,[]) } Add(Edit,10247673,532,252) { Left=105 Top=20 Width=185 Text="" } Add(Edit,9970630,532,343) { Left=105 Top=45 Width=85 Text="" link(Str,11902145:Value,[]) } Add(Edit,3141866,532,434) { Left=105 Top=70 Width=85 Text="" link(Str,13613115:Value,[]) } Add(Memory,11902145,532,294) { } Add(Memory,13613115,532,385) { } Add(Hub,16042993,455,252) { OutCount=3 link(onEvent1,10247673:doText,[]) link(onEvent2,9970630:doText,[(509,265)(509,349)]) link(onEvent3,3141866:doText,[(509,272)(509,440)]) }
------------ Дoбавленo:
И еще -- как передавать указатель на строку (в LParam) при выполнении запроса WM_SETTEXT в компоненте SendMessage не применяя дополнительно IC-код, ведь компонент считывает данные типа Integer в LParam. Или этот компонент дорабатывать надо
Вот, что-то типа того проще нельзя сделать
------------ Дoбавленo:
Ну вот к нему и приемник для проверки.
Add(MainForm,3118620,182,231) { Left=20 Top=105 Width=341 Height=144 Point(Handle) } Add(InlineCode,990011,182,294) { EventPoints=#7:Message|6:WParam|6:LParam| Code=#15:unit HiAsmUnit;|0:|9:interface|0:|29:uses Windows,kol,Share,Debug;|0:|4:type|28: THiAsmClass = class(TDebug)|10: private|17: FWnd:THandle;|9: public|23: Message:THI_Event;|22: WParam:THI_Event;|27: LParam:THI_Event; |24: constructor Create;|34: destructor Destroy; override;|5: end;|0:|14:implementation|0:|83:function MyWndProc(wnd:THandle; wMsg:cardinal; wParam,lParam:DWORD):DWORD; stdcall;|26:var MySelf: THiAsmClass;|5:begin|57: MySelf := THiAsmClass(GetWindowLong(wnd,GWL_USERDATA));|46: _hi_onEvent(MySelf.WParam, integer(wParam));|48: _hi_onEvent(MySelf.LParam, integer(lParam)); |45: _hi_onEvent(MySelf.Message, integer(wMsg));|50: Result := DefWindowProc(wnd,wMsg,wParam,lParam);|4:end;|0:|31:constructor THiAsmClass.Create;|5:begin|13: inherited;|113: FWnd := CreateWindow('ReceiveMessage','',{WS_OVERLAPPEDWINDOW or }WS_POPUP, 0, 0, 0, 0, 0, 0, hInstance, nil);|51: SetWindowLong(FWnd,GWL_USERDATA,cardinal(Self));|7:end; |0:|31:destructor THiAsmClass.Destroy;|5:begin|31: Windows.DestroyWindow(FWnd);|13: FWnd := 0;|13: inherited;|4:end;|0:|29:var MyWindowClass: TWndClass;|0:|14:initialization|0:|27: MyWindowClass.style := 0;|42: MyWindowClass.lpfnWndProc := @MyWndProc;|32: MyWindowClass.cbClsExtra := 0;|32: MyWindowClass.cbWndExtra := 0;|39: MyWindowClass.hInstance := hInstance;|27: MyWindowClass.hIcon := 0;|29: MyWindowClass.hCursor := 0;|35: MyWindowClass.hbrBackground := 0;|36: MyWindowClass.lpszMenuName := nil;|50: MyWindowClass.lpszClassName := 'ReceiveMessage';|31: RegisterClass(MyWindowClass);|0:|4:end.| link(Message,15312136:doValue,[]) link(WParam,14681702:doValue,[]) link(LParam,12200622:doValue,[]) } Add(SendMessage,9819632,308,420) { Message=10 Point(Message) link(Handle,13275602:Handle,[]) link(WParam,14681702:Value,[(321,388)(244,388)]) link(LParam,12200622:Value,[(328,380)(293,380)]) link(Message,15312136:Value,[]) } Add(Memory,15312136,329,294) { link(onData,9819632:doSendMessage,[(373,300)(373,363)(296,363)(296,426)]) } Add(Memory,14681702,238,301) { } Add(Memory,12200622,287,308) { } Add(Label,13275602,301,238) { Left=65 Top=20 Width=205 Height=25 Font=[MS Sans Serif,12,1,0,1] Caption="" AutoSize=1 Alignment=2 Point(Handle) }
Таким способом можно управлять любыми своими приложениями, и даже текст передавать. Это, конечно, не совсем то, о чем мы давно рассуждлали (что нет у нас рессивера сообщений), хотя, он выполняет прием сообщений вполне успешно, но что-то все равно получилось интересное, и гораздо проще, чем DDE.
|