1 (изменено: alex208210, 2015-04-10 09:06:42)

Тема: AHK:WM_COPYDATA

Привет друзья. Помогите поймать сообщениее WM_COPYDATA со строкой из внешней программы. Я пишу под wince.
Если  запустить sender, он пошлет сообщение для всех окон WM_COPYDATA со строкой hello. Если запустить listener, он получает сообщение и выводит строку.
Но на AHK сделать слушателя не получается, который мог бы принять эти сообщения.

Я пытался написать такой код:


Gui, +AlwaysOnTop
Gui, Add, Text, vtextv w400 h60
Gui, Show

StrGet(Address, Length=-1, Encoding=0)
{
    if A_IsUnicode
    {
        MsgBox %A_ThisFunc% does not support Unicode. Use the AutoHotkey_L (revision 46+) built-in version instead. The script will now exit.
        ExitApp
    }
    
    ; Flexible parameter handling:
    if Length is not integer
        Encoding := Length,  Length := -1
    
    ; Check for obvious errors.
    if (Address+0 < 1024)
        return
    
    ; Ensure 'Encoding' contains a numeric identifier.
    if Encoding = UTF-16
        Encoding = 1200
    else if Encoding = UTF-8
        Encoding = 65001
    else if SubStr(Encoding,1,2)="CP"
        Encoding := SubStr(Encoding,3)
    
    if !Encoding ; "" or 0
    {
        ; No conversion necessary, but we might not want the whole string.
        if (Length == -1)
            Length := DllCall("lstrlen", "uint", Address)
        VarSetCapacity(String, Length)
        DllCall("lstrcpyn", "str", String, "uint", Address, "int", Length + 1)
    }
    else if Encoding = 1200 ; UTF-16
    {
        char_count := DllCall("WideCharToMultiByte", "uint", 0, "uint", 0x400, "uint", Address, "int", Length, "uint", 0, "uint", 0, "uint", 0, "uint", 0)
        VarSetCapacity(String, char_count)
        DllCall("WideCharToMultiByte", "uint", 0, "uint", 0x400, "uint", Address, "int", Length, "str", String, "int", char_count, "uint", 0, "uint", 0)
    }
    else if Encoding is integer
    {
        ; Convert from target encoding to UTF-16 then to the active code page.
        char_count := DllCall("MultiByteToWideChar", "uint", Encoding, "uint", 0, "uint", Address, "int", Length, "uint", 0, "int", 0)
        VarSetCapacity(String, char_count * 2)
        char_count := DllCall("MultiByteToWideChar", "uint", Encoding, "uint", 0, "uint", Address, "int", Length, "uint", &String, "int", char_count * 2)
        String := StrGet(&String, char_count, 1200)
    }
    return String
}

#SingleInstance
OnMessage(0x4a, "Receive_WM_COPYDATA") 
return

Receive_WM_COPYDATA(wParam, lParam)
{
    StringAddress := NumGet(lParam + 2 *A_PtrSize)
    CopyOfData := StrGet(StringAddress)
    guicontrol, ,textv ,Received the following string: %CopyOfData%
    return true
}

guiclose:
exitapp

Скачать sender и listener можно здесь. Sender шлет раз в секунду сообщение WM_COPYDATA со строкой hello всем окнам.

Код sender:


procedure senderstr;
var
  MyCopyDataStruct: TCopyDataStruct;
begin
  with MyCopyDataStruct do
  begin
    cbData:= StrLen(PChar('hello')) + 1;
    lpData:= PChar('hello')
  end;
  SendCopyData(HWND_BROADCAST,MyCopyDataStruct);
end;

procedure SendCopyData(hTargetWnd: HWND; ACopyDataStruct:TCopyDataStruct);
begin
  if hTargetWnd<>0 then
    SendMessage(hTargetWnd, WM_COPYDATA, Longint(Form1.Handle), Longint(@ACopyDataStruct))
  else
    ShowMessage('No Recipient found!');
end;

код слушателя


function WndCallback(Ahwnd: HWND; uMsg: UINT; wParam: WParam; lParam: LParam):LRESULT; stdcall;
Var
  pMyData  : CopyDataStruct;
begin
  if uMsg=WM_COPYDATA then
     begin
     pMyData:= PCopyDataStruct(lParam)^;
     form1.memo1.lines.add(PChar(pMyData.lpData));
     end;
  result:= CallWindowProc(PrevWndProc,Ahwnd,uMsg,WParam,LParam);
end;

В Windows тоже не работает отлов сообщений, скачать exe

2

Re: AHK:WM_COPYDATA

Смотрите пример из справки OnMessage.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

3 (изменено: alex208210, 2015-04-10 09:03:29)

Re: AHK:WM_COPYDATA

Смотрел, ничего не работает, примеры пересмотрены со всех возможных к поиску сайтов, было  перепробовано 3-4 примера и ниодин не работает, поэтому и создал уже тему, может кто сможет решить проблему.

4

Re: AHK:WM_COPYDATA

alex208210, похоже, вы плохо ознакомились с указанной ранее темой. У нас принято использовать заглавные буквы и точки в конце предложений.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

5

Re: AHK:WM_COPYDATA

alex208210 пишет:

Смотрел, ничего не работает

В смысле, вообще не работает, или конкретно с вашим примером не работает?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

6

Re: AHK:WM_COPYDATA

Есть программа которая шлет WM_COPYDATA со строкой. На ahk получается поймать это сообщение например в примере выше. Но нужно достать по указателю строку из этого сообщения, а это сделать на ahk не получается. Смысла в отлове WM_COPYDATA нет если не извлекать из него данные.

7

Re: AHK:WM_COPYDATA

Так в примере из справки именно строка извлекается. Вы пример с двумя скриптами запускали? Работает он вас именно в том виде, как в справке?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

8

Re: AHK:WM_COPYDATA

Скрипт в справке, который предназначен для приема, не работает. Не извлекает строку из WM_COPYDATA от внешнего приложения.

9

Re: AHK:WM_COPYDATA

Установил Version v1.1.21.02
В Windows заработало. Попробую поискать рабочую версию для wince.

10

Re: AHK:WM_COPYDATA

Скачал последнюю версию под wince. При попытке выполнить любой скрипт запуском AutohotkeyCE.exe scr.ahk выдает ошибку приложения AutohotkeyCE.exe

Скомпилилровал последним компилятором в exe этот скрипт, запустилось, ловит сообщение, но вместо строки какие то символы, квадратики.  exe wince

11

Re: AHK:WM_COPYDATA

Про кодировки текста знаете что-нибудь?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

12

Re: AHK:WM_COPYDATA

Много чего знаем про кодировки. teadrinker, если не знаете чем помоч, просто не мешайте и не засоряйте  тему. Ваши предвзятые ответы смысл которых: "мальчик иди учи матчасть", совершенно не несут пользы.

Подскажите работает ли в wince функция ControlGetText или функции которые обращаются к заголовку окна? В Windows все эти функции типа winget видят по заголовку окна, а в wince нет. Может объявление заголовков другие?

13 (изменено: alex208210, 2015-04-10 13:15:10)

Re: AHK:WM_COPYDATA

Все вопросы снимаются, strget не работает в wince, обращение к заголовкам форм не работает в wince, только по хендлу окна