Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Пиши программы на заказ. Зарабатывай с помощью сервиса Фриланс!
urzp
53
urzp 2016.01.14 18:09 
Подскажите можно ли в mql4 поместить данные буфер обмена windows
Slawa
Модератор
6676
Slawa 2016.01.15 07:48  

Нет. Но с использованием WinAPI можно попытаться. Только надо иметь в виду, что в mql4 строки - юникодные (это нужно для правильного выставления типа данных в клипборде: CF_UNICODETEXT для юникода, CF_TEXT для ansi)

Порядок вызова функций примерно такой

  1. GlobalAlloc
  2. GlobalLock
  3. заполнение выделенного буфера
  4. GlobalUnlock
  5. OpenClipboard
  6. SetClipboardData
  7. CloseClipboard

Это описана ветка, когда всё удачно складывается. При неудаче надо обязательно вызывать GlobalFree (если GlobalAlloc был удачным). Ни в коем случае нельзя вызывать GlobalFree, если всё прошло удачно

urzp
53
urzp 2016.01.17 17:44  

Нашел такой код но проблема в том что помещаеться только первый символ текста в буфер.

Подскажите как исправить 

 

#import "kernel32.dll"
   int GlobalAlloc(int Flags, int Size);
   int GlobalLock(int hMem);
   int GlobalUnlock(int hMem);
   int GlobalFree(int hMem);
   int lstrcpyA(int ptrhMem, string Text);
#import


#import "user32.dll"
   int OpenClipboard(int hOwnerWindow);
   int EmptyClipboard();
   int CloseClipboard();
   int SetClipboardData(int Format, int hMem);
#import

#define GMEM_MOVEABLE   2

#define CF_TEXT         1

 

 // Copies the specified text to the clipboard, returning true if successful

bool CopyTextToClipboard(string Text)

  {

   bool bReturnvalue=false;


// Try grabbing ownership of the clipboard 

   if(OpenClipboard(0)!=0) 

     {

      // Try emptying the clipboard

      if(EmptyClipboard()!=0) 

        {

         // Try allocating a block of global memory to hold the text 

         int lnString=StringLen(Text);

         int hMem = GlobalAlloc(GMEM_MOVEABLE, lnString + 1);

         if(hMem!=0) 

           {

            // Try locking the memory, so that we can copy into it

            int ptrMem = GlobalLock(hMem);

            if(ptrMem!=0) 

              {

               // Copy the string into the global memory

               lstrcpyA(ptrMem,Text);

               // Release ownership of the global memory (but don't discard it)

               GlobalUnlock(hMem);


               // Try setting the clipboard contents using the global memory

               if(SetClipboardData(CF_TEXT,hMem)!=0) 

                 {

                  // Okay

                  bReturnvalue=true;

                    } else {

                  // Failed to set the clipboard using the global memory

                  GlobalFree(hMem);

                 }

                 } else {

               // Meemory allocated but not locked

               GlobalFree(hMem);

              }

              } else {

            // Failed to allocate memory to hold string 

           }

           } else {

         // Failed to empty clipboard

        }

      // Always release the clipboard, even if the copy failed

      CloseClipboard();

        } else {

      // Failed to open clipboard

     }


   return (bReturnvalue);

  }

Ihor Herasko
8431
Ihor Herasko 2016.01.17 17:50  
lstrcpyA изменить на lstrcpyW
Slawa
Модератор
6676
Slawa 2016.01.18 06:19  
urzp:

Нашел такой код но проблема в том что помещаеться только первый символ текста в буфер.


Вам явно было сказано

Только надо иметь в виду, что в mql4 строки - юникодные (это нужно для правильного выставления типа данных в клипборде: CF_UNICODETEXT для юникода, CF_TEXT для ansi)

/
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий