powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / cannot open clipboard
52 сообщений из 52, показаны все 3 страниц
cannot open clipboard
    #39194437
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
D2007

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
if Clipboard.HasFormat(CF_TEXT) then
....
....

        try
          value := Clipboard.AsText;// ошибка здесь
        except

        end;//try except



здесь есть три темы на форуме, их прочел, не нашёл там ничего полезного

как же всё-таки правильно?
...
Рейтинг: 0 / 0
cannot open clipboard
    #39194449
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
добавиил:

Код: pascal
1.
2.
3.
          value := Clipboard.AsText;
          if GetLastError <> 0 then
            MessageBox(SysErrorMessage(GetLastError) + ', GetLastError: ' + IntToStr(GetLastError), constError, MB_OK+MB_ICONERROR);



вываливается только " cannot open clipboard "
...
Рейтинг: 0 / 0
cannot open clipboard
    #39194471
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11,

1. может там данные нетекстовые?
2. другие программы нормально работают?
...
Рейтинг: 0 / 0
cannot open clipboard
    #39194483
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaon. может там данные нетекстовые?

я же написал:
if Clipboard.HasFormat(CF_TEXT) then
...
Рейтинг: 0 / 0
cannot open clipboard
    #39194486
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaon2. другие программы нормально работают?

какие другие?
...
Рейтинг: 0 / 0
cannot open clipboard
    #39194491
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
возможно, я понял причину

У МЕНЯ БЫЛО ТАК
Код: pascal
1.
2.
3.
4.
5.
6.
7.
value := Clipboard.AsText;

...
...
...
а потом сразу
s := Clipboard.AsText;



я переделал
Код: pascal
1.
s := value;


отправил пользователю
у меня пока ошибок не наблюдалось
отправил на тестирование пользователю
...
Рейтинг: 0 / 0
cannot open clipboard
    #39196775
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проблема решилась не полностью
в течение часа 3-5 раз появляется сообщение
...
Рейтинг: 0 / 0
cannot open clipboard
    #39196786
Zelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11,

Может в системе стоят следилки за клипбоардом? Можно посмотреть GetClipboardViewer покажет ли что нить. Плюс, посмотреть что вернет GetOpenClipboardWindow после ошибки.
...
Рейтинг: 0 / 0
cannot open clipboard
    #39196959
Michael Longneck
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Совет будет некрасивый, но практичный. В ответ на этот Exception взять маленькую паузу и повторить действие. OleGetClipboard у меня выдавал регулярно такое сообщение, будучи вызываемым очень часто (TAction.OnUpdate). Я проблему свою решил через IsClipboardFormatAvailable. Но так, как у тебя проблема дальше, уже в операции внесения данных то выход - взять паузу и повторить.
...
Рейтинг: 0 / 0
cannot open clipboard
    #39196976
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а как сделать, чтобы окно с текстом " cannot open clipboard " не появлялось?
...
Рейтинг: 0 / 0
cannot open clipboard
    #39196978
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дело в том, что появляется как раз не exception, а простое окно
...
Рейтинг: 0 / 0
cannot open clipboard
    #39196983
Michael Longneck
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну например отказаться от услуг Clipbrd модуля и вызвать все API вручную. Но честно говоря не нашёл я в этом модуле MessageBox. Всё там нормально (XE7)
...
Рейтинг: 0 / 0
cannot open clipboard
    #39196988
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Michael LongneckНо честно говоря не нашёл я в этом модуле MessageBox.
Его TAplication должен выдавать.
...
Рейтинг: 0 / 0
cannot open clipboard
    #39196993
Michael Longneck
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну так не без посредства же raise exception. Там есть подозрительный момент,
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
procedure TClipboard.MainWndProc(var Message: TMessage);
begin
  try
    WndProc(Message);
  except
    if Assigned(ApplicationHandleException) then
      ApplicationHandleException(Self)
    else
      raise;
  end;
end;



но тогда просто надо Application.OnException подцепить и там сделать свою обработку.
...
Рейтинг: 0 / 0
cannot open clipboard
    #39197083
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11,

авторя же написал:
if Clipboard.HasFormat(CF_TEXT) then


между проверкой и вставкой проходит время. возможно, что формат меняется за эти доли секунды

авторкакие другие?

любые, которые с текстовым клипбордом работают
...
Рейтинг: 0 / 0
cannot open clipboard
    #39197091
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaonмежду проверкой и вставкой проходит время. возможно, что формат меняется за эти доли секунды

нет, это исключено
я копирую в буфер обмена и программа выдаёт ошибку
я сразу же вставляю, например, в блокнот, чтобы проверить, что скопировалось и вижу, что проблем нет - вставилось в блокнот именно то, что копировал
...
Рейтинг: 0 / 0
cannot open clipboard
    #39197102
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Zeliusпосмотреть что вернет GetOpenClipboardWindow после ошибки.

...
Рейтинг: 0 / 0
cannot open clipboard
    #39197142
Zelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11,

HWND WINAPI GetOpenClipboardWindow(void); - посмотреть что за хендл она вернет (можно и до и после вызова) и по нему поискать кому принадлежит окно через Spy++
...
Рейтинг: 0 / 0
cannot open clipboard
    #39197429
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может, с юникодом какие грабли?

Попробуй допилить эту функцию

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
function GetClipboardString: WideString;
var
  LClip: TClipboard;
  LMem: THandle;
  LPtr: Pointer;
begin
  LClip := Clipboard;
  LClip.Open;
  try
    if not LClip.HasFormat(CF_UNICODETEXT) then
      Result := LClip.AsText
    else begin
      LMem := LClip.GetAsHandle(CF_UNICODETEXT);
      LPtr := GlobalLock(LMem);
      try
        SetString(Result, PWideChar(LPtr), GlobalSize(LMem) div SizeOf(Result[1]));
      finally
        GlobalUnlock(LMem);
      end;
    end;
  finally
    LClip.Close;
  end;
end;
...
Рейтинг: 0 / 0
cannot open clipboard
    #39197536
fd00ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кто-то открыл буфер и не закрыл. ты лезешь за данными - получаешь отлуп

Michael LongneckНо честно говоря не нашёл я в этом модуле MessageBoxхех, надо было искать raise EClipboardException.Create. этот же тип ошибок и ловить в Application.OnException, если надо их погасить
...
Рейтинг: 0 / 0
cannot open clipboard
    #39197637
Zelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11,

+1 к _Vasilisk_, лочишь клипбоард и никуда он больше от тебя не денется, а если не лочится, то значит и не был твоим...
...
Рейтинг: 0 / 0
cannot open clipboard
    #39197783
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_Может, с юникодом какие грабли?

Программа, откуда копируют - моя и следит ща буфером тоже моя.
обе на D2007 написаны
...
Рейтинг: 0 / 0
cannot open clipboard
    #39208276
Zelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11,

была недавно такая же ситуация, что-то блокировало клипбоард, сделал свой клипборад
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
type
  TClipboardExt = class(TClipboard)
  public
    procedure Open; override;
  end;

  TClipboardHelper = class helper for TClipboard
  public
    class function GetLockInfo: String;
  end;

procedure InstallExtClipboard;
begin
  SetClipboard(TClipboardExt.Create).Free;
end;

procedure TClipboardExt.Open;
var
  LockInfo: String;
begin
  try
    inherited Open;
  except
    on E: Exception do
    begin
      LockInfo := GetLockInfo;
      if LockInfo <> '' then
        E.Message := E.Message + Format( ' (locked by %s)', [LockInfo]);
      raise;
    end;
  end;
end;

class function TClipboardHelper.GetLockInfo: String;
var
  i: Integer;
  Buffer: array[0..1024] of Char;
  Wnd: HWND;
begin
  Result := '';
  Wnd := GetOpenClipboardWindow();
  if Wnd = 0 then Exit;

  Result := Format('HWND=%x', [Wnd]);

  i := GetWindowText( Wnd, Buffer, Length(Buffer));
  if i > 0 then
    Result := Result + '; Caption=' + Buffer;

  i := GetClassName( Wnd, Buffer, Length(Buffer));
  if i > 0 then
    Result := Result + '; Class=' + Buffer;

  if GetCurrentThreadId <> MainThreadID then
    Result := Result + '; ThreadID=' + IntToHex( GetCurrentThreadId, 8);
end;

initialization
  InstallExtClipboard;


в результате поймал HWND (остальная информация не помогла), через Spy++ выяснилось, что это сама дельфи (Seattle), наверное какое-то плагин... дальше копать не стал
...
Рейтинг: 0 / 0
cannot open clipboard
    #39208286
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Zeliusчерез Spy++ выяснилось, что это сама дельфи (Seattle), наверное какое-то плагин... дальше копать не стал

у пользователя нет дельфи
...
Рейтинг: 0 / 0
cannot open clipboard
    #39208294
Zelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11,

это все на что ты обратил внимание?
...
Рейтинг: 0 / 0
cannot open clipboard
    #39208312
fd00ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Zelius, тебе в GetLockInfo надо бы пройтись по цепочке GetWindowThreadProcessId -> OpenProcess -> GetModuleFileNameEx, чтобы получить имя процесса, захватившего буфер ;-)
...
Рейтинг: 0 / 0
cannot open clipboard
    #39208319
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZeliusX11,

это все на что ты обратил внимание?

ну я код не изучал :)
не хочу его использовать
пока не хочу )))
...
Рейтинг: 0 / 0
cannot open clipboard
    #39208350
Фотография Gator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Zelius, у него D2007. Там нет хелперов.
...
Рейтинг: 0 / 0
cannot open clipboard
    #39208352
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gatorу него D2007. Там нет хелперов.В 2006 уже были
...
Рейтинг: 0 / 0
cannot open clipboard
    #39208357
Фотография Gator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_, точно. Есть. Затупил.
...
Рейтинг: 0 / 0
cannot open clipboard
    #39208375
Zelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторну я код не изучал :)

прелестно!

я показал методику, как с большой вероятностью можно определить кем заблокирован клипбоард. хелперы я просто вырезал из своего кода, не писать же новый, тем более ТСу то ничего и не надо, кроме готового разжеванного ответа. ну может кто-то из гугла заглянет...
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
cannot open clipboard
    #39732474
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чтобы скопировать что-то своё в буфер, достаточно ли просто одной строки
Код: pascal
1.
Clipboard.AsText := s;


?

Или нужна обёртка из:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
  if not s.IsEmpty then
  begin
    Clipboard.Open;
    try
      Clipboard.AsText := s;
    finally
      Clipboard.close;
    end;
  end;



Вопрос в продолжение моей темы. Имею две программы. Одна что-то копирует в буфер, вторая мониторит буфер и ловит инфу.
Дело в том, что в первой программе я делаю просто копирование в буфер одной строкой.
Но когда в другой своей программе, я пытаюсь прочесть из буфера строку, то получаю ошибку:
ERROR. WMDrawClipboard. ClipboardOwner=9511674. WindowThreadProcessId=11108. Cannot open clipboard: Отказано в доступе

В Диспетчере задач посмотрел, что это за WindowThreadProcessId=11108, а это моя первая программа.
...
Рейтинг: 0 / 0
cannot open clipboard
    #39732482
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и нужно ли делать такую обёртку, когда читаешь из буфера?
или ждостаточной одной строки?
Код: pascal
1.
value := Clipboard.AsText;
...
Рейтинг: 0 / 0
cannot open clipboard
    #39732486
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11или ждостаточной одной строки?
Спорю, что проверить это было-бы быстрее ожидания ответа на форуме.
На втором месте чтение справки:
авторUse the AsText property to place text in and retrieve text from the clipboard. The clipboard must contain a string or an exception occurs. To determine if the clipboard contains a string, pass CF_TEXT to the HasFormat method.
...
Рейтинг: 0 / 0
cannot open clipboard
    #39732491
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
13.11.2018 15:14, X11 пишет:
> Чтобы скопировать что-то своё в буфер, достаточно ли просто одной строки
> Clipboard.AsText := s;

если тебе похеру "крякозябры", то да.
а если НЕ похеру, то

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
function SendToClipboard(const S: string): boolean;
var
  hClipbrd: THandle;
begin
  Result := True;
  Clipboard.Open;
  Clipboard.AsText := S;
  hClipbrd := Clipboard.GetAsHandle(CF_TEXT);
  if hClipbrd = INVALID_HANDLE_VALUE then
    Result := False
  else
    SetClipboardData(CF_LOCALE, hClipbrd);
  Clipboard.Close;
end;



Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
cannot open clipboard
    #39732504
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanСпорю, что проверить это было-бы быстрее ожидания ответа на форуме.

Параллельно проверяю.
Эффект нулевой.
Всё равно вторая программа выдаёт исключение при чтении буфера.


wadmanНа втором месте чтение справки:
Читал. Только не понял, нужно ли при записи в буфер самому указывать формат или это за меня сделает Дельфи.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
procedure TClipboard.SetAsText(const Value: string);
{$IF NOT DEFINED(CLR)}
begin
  SetBuffer(CTextFormat, PChar(Value)^, ByteLength(Value) + SizeOf(Char));
{$ELSE}
var
  Buffer: TBytes;
begin
  Buffer := WideBytesOf(Value + #0);
  SetBuffer(CTextFormat, Buffer, Length(Buffer))
{$ENDIF}
end;
...
Рейтинг: 0 / 0
cannot open clipboard
    #39732506
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящийесли тебе похеру "крякозябры", то да.

ОК, т.е. получается, что в коде чтения из буфера проблема.
Но если обратиться к справке

справкаThe clipboard must contain a string or an exception occurs.
то исключения быть не должно, т.к. в буфере 100% строка.
Т.к. я отправляю в первой программе именно строку в буфер.

Я уже 100500 проверок перепробовал в коде чтения из буфера. Задолбало это исключение.
...
Рейтинг: 0 / 0
cannot open clipboard
    #39732507
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Локаль мне не нужна, т.к. я отправляю в буфер только цифры.
...
Рейтинг: 0 / 0
cannot open clipboard
    #39732508
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11Всё равно вторая программа выдаёт исключение при чтении буфера.
Странно, но у меня asText работает в обоих направлениях.
Но Мимопроходящий верно отметил, что с юникодом беда.
...
Рейтинг: 0 / 0
cannot open clipboard
    #39732510
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящий> Чтобы скопировать что-то своё в буфер, достаточно ли просто одной строки
> Clipboard.AsText := s;

если тебе похеру "крякозябры", то да.

Ты пишешь, что достаточно одной этой строки, но тут же предлагаешь код с обёрткой из open/close.
...
Рейтинг: 0 / 0
cannot open clipboard
    #39732512
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11Я уже 100500 проверок перепробовал в коде чтения из буфера. Задолбало это исключение.
Напиши свою обертку зарегистрировав свой формат клипборда как строку.
Это исключит кучу ошибок. Например, таким образом сделано у фастрепорта.
...
Рейтинг: 0 / 0
cannot open clipboard
    #39732513
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanСтранно, но у меня asText работает в обоих направлениях.

У меня тоже в обоих, но исключение почти всегда на читающей стороне.
...
Рейтинг: 0 / 0
cannot open clipboard
    #39732518
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman, мне не нужен свой формат, т.к. пользователь копирует в буфер текст не только из первой моей программы, но так же текст и из Блокнота, из браузера, ещё откуда-то.
...
Рейтинг: 0 / 0
cannot open clipboard
    #39732519
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11, придется разбираться тогда... Какое исключение?
...
Рейтинг: 0 / 0
cannot open clipboard
    #39732524
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
При чтении, я, конечно же проверяю
if Clipboard.HasFormat(CF_TEXT) then
...
Рейтинг: 0 / 0
cannot open clipboard
    #39732525
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanКакое исключение?

выше я написал:
X11ERROR. WMDrawClipboard. ClipboardOwner=9511674. WindowThreadProcessId=11108. Cannot open clipboard: Отказано в доступе
...
Рейтинг: 0 / 0
cannot open clipboard
    #39732528
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот что я заметил, когда я отлаживаю код, то ошибки нет. Исключения нет.
Может нужно перед проверкой сделать какую-то паузу?
...
Рейтинг: 0 / 0
cannot open clipboard
    #39732529
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сделал
Код: pascal
1.
2.
Sleep(300);
value := Clipboard.AsText;



И ошибка исчезла.
Но нигде в справке этого нет. Это Винда виновата? Антивирус?
...
Рейтинг: 0 / 0
cannot open clipboard
    #39732530
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
cannot open clipboard
    #39732535
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11Вот что я заметил, когда я отлаживаю код, то ошибки нет. Исключения нет.
Операция с буфером затратная по времени. Если ты в одном месте сразу вставляешь и сразу достаешь, то стоит делать некую паузу. Например, вставь из блокнота, переключись на свое приложение и проверь.
Это и есть типичный сценарий.
Для взаимодействия на уровне одной программы без участия пользователя лучше задействовать иные механизмы.
...
Рейтинг: 0 / 0
cannot open clipboard
    #39732544
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11Имею две программы. Одна что-то копирует в буфер, вторая мониторит буфер и ловит инфу.
Хм... Я-бы в таком случае мониторил не только буфер и отсутствие владельца буфера: https://docs.microsoft.com/en-us/windows/desktop/api/Winuser/nf-winuser-getclipboardowner
Обработчики буфера, всякие мультибуферы и т.п. как-то работают без исключений.
...
Рейтинг: 0 / 0
cannot open clipboard
    #39732562
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanне только буфер и отсутствие владельца буфера

Да, есть такое. Я уже 100500 проверок поставил
...
Рейтинг: 0 / 0
52 сообщений из 52, показаны все 3 страниц
Форумы / Delphi [игнор отключен] [закрыт для гостей] / cannot open clipboard
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]