Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.11.14;
Скачать: CL | DM;

Вниз

Буфер обмена.   Найти похожие ветки 

 
msdn11   (2004-10-27 18:40) [0]

Всем привет. Вопрос такой:как емулировать вставку из буфера на делфи(только не в едит или мемо а в "левое" окно). Другими словами надо заставить винду вставить из буфера текст. Я устанавливаю курсор в нужное мне поле IE(там у меня форма html TWebBrowser и всё такое), храню в буфере то, что мне нужно, а как вставить не знаю. Помогите.


 
msdn11   (2004-10-27 18:58) [1]

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


 
msdn11   (2004-10-27 19:14) [2]

да уж за 3 года мне ответили на 1 вопрос толком. хоть я и не прошу готовых решений :-(


 
PVOzerski ©   (2004-10-27 19:25) [3]

Почитай об OLE-интерфейсах, поддерживаемых IE. Думаю, в Интернете найти это можно.


 
msdn11   (2004-10-27 19:30) [4]

два дня рою, ни фига нету


 
alena.svt ©   (2004-10-27 19:33) [5]

procedure PostKeyEx32(Key: Word; const Shift: TShiftState; SpecialKey: Boolean);
{************************************************************
* Procedure PostKeyEx32
*
* Parameters:
*  key    : virtual keycode of the key to send. For printable
*           keys this is simply the ANSI code (Ord(character)).
*  shift  : state of the modifier keys. This is a set, so you
*           can set several of these keys (shift, control, alt,
*           mouse buttons) in tandem. The TShiftState type is
*           declared in the Classes Unit.
*  specialkey: normally this should be False. Set it to True to
*           specify a key on the numeric keypad, for example.
* Description:
*  Uses keybd_event to manufacture a series of key events matching
*  the passed parameters. The events go to the control with focus.
*  Note that for characters key is always the upper-case version of
*  the character. Sending without any modifier keys will result in
*  a lower-case character, sending it with [ssShift] will result
*  in an upper-case character!
*Created: 17.7.98 by P. Below
************************************************************}
type
  TShiftKeyInfo = record
  Shift: Byte;
  Vkey : Byte;
  end;
  ByteSet = set of 0..7;
const
  ShiftKeys: array [1..3] of TShiftKeyInfo =
    ((Shift: Ord(ssCtrl); Vkey: VK_CONTROL),
     (Shift: Ord(ssShift); Vkey: VK_SHIFT),
     (Shift: Ord(ssAlt); Vkey: VK_MENU));
var
  Flag: DWORD;
  bShift: ByteSet absolute Shift;
  I: Integer;
begin
  for I := 1 to 3 do begin
    if ShiftKeys[I].Shift In bShift Then
      keybd_event(ShiftKeys[I].Vkey,MapVirtualKey(ShiftKeys[I].Vkey,0),0,0);
  end;
  if SpecialKey then
    Flag := KEYEVENTF_EXTENDEDKEY
  else
    Flag := 0;

  keybd_event(Key,MapvirtualKey(Key,0),Flag,0);
  Flag := Flag or KEYEVENTF_KEYUP;
  keybd_event(Key, MapvirtualKey(Key,0),Flag,0);

  for i := 3 downto 1 do begin
    if ShiftKeys[I].Shift In bShift then
      keybd_event(ShiftKeys[I].Vkey,MapVirtualKey(ShiftKeys[I].Vkey,0),KEYEVENTF_KEYUP,0);
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var h:thandle;
begin
H := FindWindow("Notepad",nil);
if H > 0 then
if SetForegroundWindow(H) then
  PostKeyEx32(Ord("V"),[ssCtrl],false);
end;


 
TUser ©   (2004-10-27 19:34) [6]


> Почитай об OLE-интерфейсах, поддерживаемых IE.

Об этом он уже читал - смотрите 2 вопроса за сегодня.

Послать ему Ctrl-V, наверное проще всего


 
msdn11   (2004-10-27 19:36) [7]

не скромный вопрос: а как?


 
msdn11   (2004-10-27 19:38) [8]

пытаюсь так
procedure TForm1.Button2Click(Sender: TObject);
var
input:OleVariant;
i:integer;
href:string;
begin
WebBrowser1.Navigate(ExtractFilePath(application.ExeName)+"1.html");

for i:=0 to WebBrowser1.OleObject.document.all.tags("input").length-2 do
begin
   WebBrowser1.OleObject.document.all.tags("input").item(i).focus;
   sendmessage(getfocus,wm_paste,0,0);
   WebBrowser1.Stop;
end;


 
msdn11   (2004-10-27 19:40) [9]

не выходит...


 
alena.svt ©   (2004-10-27 19:49) [10]

а чего пост 5 не работает не может быть
procedure TForm1.Button1Click(Sender: TObject);
var
H :THandle;
begin
H := FindWindow("TForm1",nil);
if H > 0 then
 if SetForegroundWindow(H) then
 begin
  keybd_event(VK_CONTROL, MapVirtualKey(VK_CONTROL, 0), 0, 0);
  keybd_event(Ord("V"), MapVirtualKey(Ord("V"), 0), 0, 0);
  keybd_event(Ord("V"), MapVirtualKey(Ord("V"), 0), KEYEVENTF_KEYUP, 0);
  keybd_event(VK_CONTROL, MapVirtualKey(VK_CONTROL, 0), KEYEVENTF_KEYUP, 0);
 end;
end;


 
msdn11   (2004-10-27 19:50) [11]

хотя что - то стало получаться :-)


 
alena.svt ©   (2004-10-27 19:55) [12]

if SetForegroundWindow(H) then
begin
 Combobox1.SetFocus;
 keybd_event(VK_CONTROL, MapVirtualKey(VK_CONTROL, 0), 0, 0);
 ................
....................
.....................
end;


 
msdn11   (2004-10-27 20:01) [13]

А как PostKeyEx32 tab нажать?


 
alena.svt ©   (2004-10-27 20:03) [14]

Если просто таб
то  PostKeyEx32(VK_TAB,[],false);


 
alena.svt ©   (2004-10-27 20:07) [15]

Просто если в своей форме
То SetFocus для компонента
а потом PostKeyEx32(VK_TAB,[],false);
или  PostKeyEx32(Ord("V"),[ssCtrl],false);// Вставка
а FindWindow и т.д. не надо


 
msdn11   (2004-10-27 20:07) [16]

Работает. Но пока коряво(поправим). Спасибо Вам Лена. Вы меня спасли.


 
begin...end ©   (2004-10-27 20:08) [17]

На то она и Добрая Девочка ;-)


 
PVOzerski ©   (2004-10-27 20:15) [18]

Мне развираться с конкретной задачей некогда, я нарыл это из своих кладовок (кстати, кто-то из Мастаков выслал).
 IWebBrowser = interface(IDispatch)
   ["{EAB22AC1-30C1-11CF-A7EB-0000C05BAE0B}"]
   procedure GoBack; safecall;
   procedure GoForward; safecall;
   procedure GoHome; safecall;
   procedure GoSearch; safecall;
   procedure Navigate(const URL: WideString; var Flags: OleVariant;
                      var TargetFrameName: OleVariant; var PostData: OleVariant;
                      var Headers: OleVariant); safecall;
   procedure Refresh; safecall;
   procedure Refresh2(var Level: OleVariant); safecall;
   procedure Stop; safecall;
   function  Get_Application: IDispatch; safecall;
   function  Get_Parent: IDispatch; safecall;
   function  Get_Container: IDispatch; safecall;
   function  Get_Document: IDispatch; safecall;
   function  Get_TopLevelContainer: WordBool; safecall;
   function  Get_Type_: WideString; safecall;
   function  Get_Left: Integer; safecall;
   procedure Set_Left(pl: Integer); safecall;
   function  Get_Top: Integer; safecall;
   procedure Set_Top(pl: Integer); safecall;
   function  Get_Width: Integer; safecall;
   procedure Set_Width(pl: Integer); safecall;
   function  Get_Height: Integer; safecall;
   procedure Set_Height(pl: Integer); safecall;
   function  Get_LocationName: WideString; safecall;
   function  Get_LocationURL: WideString; safecall;
   function  Get_Busy: WordBool; safecall;
   property Application: IDispatch read Get_Application;
   property Parent: IDispatch read Get_Parent;
   property Container: IDispatch read Get_Container;
   property Document: IDispatch read Get_Document;
   property TopLevelContainer: WordBool read Get_TopLevelContainer;
   property Type_: WideString read Get_Type_;
   property Left: Integer read Get_Left write Set_Left;
   property Top: Integer read Get_Top write Set_Top;
   property Width: Integer read Get_Width write Set_Width;
   property Height: Integer read Get_Height write Set_Height;
   property LocationName: WideString read Get_LocationName;
   property LocationURL: WideString read Get_LocationURL;
   property Busy: WordBool read Get_Busy;
 end;

 IWebBrowserApp = interface(IWebBrowser)
   ["{0002DF05-0000-0000-C000-000000000046}"]
   procedure Quit; safecall;
   procedure ClientToWindow(var pcx: SYSINT; var pcy: SYSINT); safecall;
   procedure PutProperty(const Property_: WideString; vtValue: OleVariant); safecall;
   function  GetProperty(const Property_: WideString): OleVariant; safecall;
   function  Get_Name: WideString; safecall;
   function  Get_HWND: Integer; safecall;
   function  Get_FullName: WideString; safecall;
   function  Get_Path: WideString; safecall;
   function  Get_Visible: WordBool; safecall;
   procedure Set_Visible(pBool: WordBool); safecall;
   function  Get_StatusBar: WordBool; safecall;
   procedure Set_StatusBar(pBool: WordBool); safecall;
   function  Get_StatusText: WideString; safecall;
   procedure Set_StatusText(const StatusText: WideString); safecall;
   function  Get_ToolBar: SYSINT; safecall;
   procedure Set_ToolBar(Value: SYSINT); safecall;
   function  Get_MenuBar: WordBool; safecall;
   procedure Set_MenuBar(Value: WordBool); safecall;
   function  Get_FullScreen: WordBool; safecall;
   procedure Set_FullScreen(pbFullScreen: WordBool); safecall;
   property Name: WideString read Get_Name;
   property HWND: Integer read Get_HWND;
   property FullName: WideString read Get_FullName;
   property Path: WideString read Get_Path;
   property Visible: WordBool read Get_Visible write Set_Visible;
   property StatusBar: WordBool read Get_StatusBar write Set_StatusBar;
   property StatusText: WideString read Get_StatusText write Set_StatusText;
   property ToolBar: SYSINT read Get_ToolBar write Set_ToolBar;
   property MenuBar: WordBool read Get_MenuBar write Set_MenuBar;
   property FullScreen: WordBool read Get_FullScreen write Set_FullScreen;
 end;

 IWebBrowser2 = interface(IWebBrowserApp)
   ["{D30C1661-CDAF-11D0-8A3E-00C04FC9E26E}"]
   procedure Navigate2(var URL: OleVariant; var Flags: OleVariant;
                       var TargetFrameName: OleVariant; var PostData: OleVariant;
                       var Headers: OleVariant); safecall;
   function  QueryStatusWB(cmdID: OLECMDID): OLECMDF; safecall;
   procedure ExecWB(cmdID: OLECMDID; cmdexecopt: OLECMDEXECOPT; var pvaIn: OleVariant;
                    var pvaOut: OleVariant); safecall;
   procedure ShowBrowserBar(var pvaClsid: OleVariant; var pvarShow: OleVariant;
                            var pvarSize: OleVariant); safecall;
   function  Get_ReadyState: tagREADYSTATE; safecall;
   function  Get_Offline: WordBool; safecall;
   procedure Set_Offline(pbOffline: WordBool); safecall;
   function  Get_Silent: WordBool; safecall;
   procedure Set_Silent(pbSilent: WordBool); safecall;
   function  Get_RegisterAsBrowser: WordBool; safecall;
   procedure Set_RegisterAsBrowser(pbRegister: WordBool); safecall;
   function  Get_RegisterAsDropTarget: WordBool; safecall;
   procedure Set_RegisterAsDropTarget(pbRegister: WordBool); safecall;
   function  Get_TheaterMode: WordBool; safecall;
   procedure Set_TheaterMode(pbRegister: WordBool); safecall;
   function  Get_AddressBar: WordBool; safecall;
   procedure Set_AddressBar(Value: WordBool); safecall;
   function  Get_Resizable: WordBool; safecall;
   procedure Set_Resizable(Value: WordBool); safecall;
   property ReadyState: tagREADYSTATE read Get_ReadyState;
   property Offline: WordBool read Get_Offline write Set_Offline;
   property Silent: WordBool read Get_Silent write Set_Silent;
   property RegisterAsBrowser: WordBool read Get_RegisterAsBrowser write Set_RegisterAsBrowser;
   property RegisterAsDropTarget: WordBool read Get_RegisterAsDropTarget write Set_RegisterAsDropTarget;
   property TheaterMode: WordBool read Get_TheaterMode write Set_TheaterMode;
   property AddressBar: WordBool read Get_AddressBar write Set_AddressBar;
   property Resizable: WordBool read Get_Resizable write Set_Resizable;
 end;

Обрати внимание на свойство Document. Вот кусок, где я изменяю выделение в элементах Select"a (списка):

var
 IE:IWebBrowser2;
...

  Document:=IE.Document;
  FunCat:=0;
  EC:=0;
  for m:=0 to Document.forms.Length-1 do
   begin
    ovElements:=Document.forms.Item(m).elements;
    for i:=ovElements.Length-1 downto 0 do
     if ovElements.item(i).type="select-multiple" then
      begin
       l:=ovElements.item(i).options.length;
       if l=FunCatCount then
        begin
         FunCat:=ovElements.item(i).options;
         FunCatFound:=true;
        end
       else if l=EcCount then
        begin
         EC:=ovElements.item(i).options;
         ECFound:=true;
        end;
      end;
   end;

За лишнее прошу прощение: выбирать некогда...


 
msdn11   (2004-10-27 20:18) [19]


> Просто если в своей форме
> То SetFocus для компонента
> а потом PostKeyEx32(VK_TAB,[],false);
> или  PostKeyEx32(Ord("V"),[ssCtrl],false);// Вставка
> а FindWindow и т.д. не надо

А если не в своей?


 
PVOzerski ©   (2004-10-27 20:20) [20]

Ну вот, ошибся: во-первых, не "развираться", а "разбираться", во-вторых, последний кусок только проверяет соответствие числа элементов ожидаемому. Но всё-таки это может помочь. BTW, имей в виду: IE-штука еще та... Когда я пытался просто через Windows-сообщения изменять выделение элементов, на экране всё получалось, а вот при отправлении содержимого формы на cgi IE об этом изменении не знал. Не вышло бы так же и с paste...


 
msdn11   (2004-10-27 20:24) [21]

Всё работает!!!!!!!!!!!!!!!!!!!!!!
Всем спасибо за помощь.


 
alena.svt ©   (2004-10-27 20:34) [22]

>>msdn11   (27.10.04 20:18) [19]
>>А если не в своей?

Открой блокнот
и напиши для кнопки код (пост 5)
Если что то есть в буфере ты увидишь это блокноте

потом открой IE и поставь курсор в поле(Combobox) URL
Сверни его
В коде замени "Notepad",nil на "IEFrame",nil

Компиль и дави кнопку
Только в буфере надо чтоб URl был



Страницы: 1 вся ветка

Текущий архив: 2004.11.14;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.048 c
3-1098104433
denis24
2004-10-18 17:00
2004.11.14
определение названия тейбла в dbedite связаного с Datasours


14-1098931204
Ostap Bender
2004-10-28 06:40
2004.11.14
Договор


14-1098651361
Neus
2004-10-25 00:56
2004.11.14
Время


1-1099320334
Kat
2004-11-01 17:45
2004.11.14
Как узнать сколько дней в январе например?


3-1097639943
Klim Samgin
2004-10-13 07:59
2004.11.14
Удаление папки после TBatchMove