Почитай про AutoHotKey. Удивишься, что только ни делают с чужими приложениями

Модератор: Дед Пахом
Почитай про AutoHotKey. Удивишься, что только ни делают с чужими приложениями
Ну я не совсем это имел в виду... Например, сколько не бейся, всё равно не получится послать в блокнот такое сообщение, чтобы он (блокнот) вдруг начал картинки рисовать.
Нужно выполнить внешнюю команду так, чтобы в уже запущенном приложении выполнился некий код. Пример:
Да вроде не первый день "замужем"
Код: Выделить всё
SendData.DataSize = SIZE(SendCString)
Код: Выделить всё
ClaSendMessage(loc:hFind, WM_COPYDATA, loc:hFind, ADDRESS(SendData))
пишут что все хорошо? - http://delphiru.ru/other/14--.htmlAdmin писал(а):Вот на этом тестировалКогда в клиенте задаешь размерСледующий код не отправляет сообщение...Код: Выделить всё
SendData.DataSize = SIZE(SendCString)
т.е. кажется Windows не может скопировать структуру при указании размера переменной из SendData.DataКод: Выделить всё
ClaSendMessage(loc:hFind, WM_COPYDATA, loc:hFind, ADDRESS(SendData))
Код: Выделить всё
PROGRAM
INCLUDE('CFCWndProc.inc')
MAP
MODULE('WinApi')
ClaRegisterWindowMessage(LONG lpString),ULONG,PASCAL,RAW,NAME('RegisterWindowMessageA')
ClaSendMessageTimeout(LONG hWnd,ULONG wMsg,ULONG wParam,LONG lParam,ULONG fuFlags,ULONG uTimeout,LONG lpdwResult),PROC,LONG,PASCAL,NAME('SendMessageTimeoutA')
ClaSendMessage(LONG hWnd,ULONG wMsg,ULONG wParam,LONG lParam),PROC,LONG,PASCAL,NAME('SendMessageA')
ClaEnumWindows(LONG lpEnumFunc,LONG lParam),BOOL,PASCAL,RAW,NAME('EnumWindows')
GetLastError(),LONG,PASCAL,RAW,NAME('GetLastError')
END
Searcher(ULONG hWnd, LONG lParam),BOOL,PASCAL
END
LOC:hFind LONG
GLO:RegMsgID LONG
GLO:SearchMsgID LONG
GLO:RegMsgStr CSTRING('MY_CLA_EVENT1')
GLO:SearchMsgStr CSTRING('MY_CLA_EVENT2')
CopyStruct GROUP,TYPE
PacketNum LONG
DataSize LONG
Data LONG
END
SendData LIKE(CopyStruct)
SendCString CSTRING(200)
WM_COPYDATA EQUATE(74)
CODE
GLO:RegMsgID = ClaRegisterWindowMessage(ADDRESS(GLO:RegMsgStr))
GLO:SearchMsgID = ClaRegisterWindowMessage(ADDRESS(GLO:SearchMsgStr))
Err# = ClaEnumWindows(ADDRESS(Searcher), ADDRESS(LOC:hFind))
IF LOC:hFind
SendCString = 'Тестовые данные для отправки в другое приложение'
SendData.PacketNum = 32768 ! используем как ID
SendData.Data = ADDRESS(SendCString)
SendData.DataSize = SIZE(SendCString)
ClaSendMessageTimeout(loc:hFind, WM_COPYDATA, loc:hFind, ADDRESS(SendData), 3, 200, 0)
!ClaSendMessage(loc:hFind, WM_COPYDATA, loc:hFind, ADDRESS(SendData))
END
Searcher PROCEDURE(ULONG hWnd, LONG lParam)!,BOOL,PASCAL
loc:Result LONG
loc:ok LONG
loc:pFind &LONG
CODE
loc:ok = ClaSendMessageTimeout(hWnd, GLO:SearchMsgID, 0, 0, 3, 200, ADDRESS(loc:Result))
IF loc:ok
IF loc:Result = 887799
loc:pFind &= (lParam)
IF NOT loc:pFind &= NULL
loc:pFind = hWnd
END
RETURN FALSE
ELSE
RETURN TRUE
END
END
RETURN TRUE
Код: Выделить всё
PROGRAM
INCLUDE('CFCWndProc.inc')
MAP
MODULE('WinApi')
ClaRegisterWindowMessage(LONG lpString),ULONG,PASCAL,RAW,NAME('RegisterWindowMessageA')
MemCpy( long dest, long src, signed n ),long,proc,name('_memcpy')
END
END
WP CLASS(CFCWndProc) ! сабклассинг окна
CallBackProc PROCEDURE(ULONG hWnd,ULONG wMsg,ULONG wParam,LONG lParam),LONG,DERIVED
END
Window WINDOW('Server'),AT(,,222,151),SYSTEM,GRAY,DOUBLE
END
GLO:RegMsgID LONG
GLO:SearchMsgID LONG
GLO:RegMsgStr CSTRING('MY_CLA_EVENT1')
GLO:SearchMsgStr CSTRING('MY_CLA_EVENT2')
CopyStruct GROUP,TYPE
PacketNum LONG
DataSize LONG
Data LONG
END
ReceivedStruct &CopyStruct
ReceivedCString &CSTRING
WM_COPYDATA EQUATE(74)
CODE
OPEN(Window)
GLO:RegMsgID = ClaRegisterWindowMessage(ADDRESS(GLO:RegMsgStr))
GLO:SearchMsgID = ClaRegisterWindowMessage(ADDRESS(GLO:SearchMsgStr))
WP.SetCallBack(Window{PROP:Handle})
ACCEPT
CASE ACCEPTED()
END
END
WP.RemoveCallback()
CLOSE(Window)
WP.CallBackProc PROCEDURE(ULONG hWnd,ULONG wMsg,ULONG wParam,LONG lParam)!,LONG,DERIVED
loc:RetValue LONG
CODE
CASE wMsg
OF WM_COPYDATA
ReceivedStruct &= (lParam)
ReceivedCString &= (ReceivedStruct.Data)
MESSAGE(ReceivedCString)
OF GLO:RegMsgID
!
OF GLO:SearchMsgID
RETURN 887799
END
RETURN PARENT.CallBackProc(hWnd,wMsg,wParam,lParam)
В таком случае все чуть чуть проще. Через wParam и lParam можно два числа передать.