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

Вниз

Какая-то путаница с окнами.   Найти похожие ветки 

 
Новичек   (2009-02-22 16:44) [0]

Имеется вызов функции Enumchildwindows(hMDI, @EnumChildWindowsProc, 0);
Код функции EnumChildWindowsProc:

    hWND := FindWindowEx(hMDI, 0, nil, Buffer);
    windows.SetForegroundWindow(hWND);
    ShowWindow(hWND, SW_NORMAL);
    Sleep(500);
    Application.ProcessMessages;
    Sleep(500);
    SendCtrY;//посылаю Ctrl+Y
    Sleep(500);
    Application.ProcessMessages;
    SendCtrEnd;//посылаю Ctrl+End
    Sleep(500);
    Application.ProcessMessages;
    SendKeys("list" + #13#10);//посылаю команду list
    Sleep(500);
    Application.ProcessMessages;
    Result := True;

Вспомогательные фунции:

procedure SendKeys(buffer: string);
var
 i: integer;
 w: word;
 D: DWORD;
 P: ^DWORD;
begin
 P := @D;
 SystemParametersInfo(//get flashing timeout on win98
   SPI_GETFOREGROUNDLOCKTIMEOUT,
   0,
   P,
   0);
 for i := 1 to length(buffer) do
 begin
   w := VkKeyScan(buffer[i]);
   keybd_event(w, 0, 0, 0);
   keybd_event(w, 0, KEYEVENTF_KEYUP, 0);
 end;
 SystemParametersInfo(//set flashing TimeOut=0
   SPI_SETFOREGROUNDLOCKTIMEOUT,
   0,
   nil,
   0);
 SetForegroundWindow(hInput);
 //->typecast working...
 SystemParametersInfo(//set flashing TimeOut=previous value
   SPI_SETFOREGROUNDLOCKTIMEOUT,
   D,
   nil,
   0);
end;

procedure SendCtrY;
var
 KeyInputs: array of TInput;
 KeyInputCount: Integer;

 procedure KeybdInput(VKey: Byte; Flags: DWORD);
 begin
   Inc(KeyInputCount);
   SetLength(KeyInputs, KeyInputCount);
   KeyInputs[KeyInputCount - 1].Itype := INPUT_KEYBOARD;
   with  KeyInputs[KeyInputCount - 1].ki do
   begin
     wVk := VKey;
     wScan := MapVirtualKey(wVk, 0);
     dwFlags := KEYEVENTF_EXTENDEDKEY;
     dwFlags := Flags or dwFlags;
     time := 0;
     dwExtraInfo := 0;
   end;
 end;
begin
 KeyInputCount:=0;
 KeybdInput(VK_CONTROL, 0);                // Ctrl
 KeybdInput(Byte("Y"), 0);                 // Y
 KeybdInput(Byte("Y"), KEYEVENTF_KEYUP);   //
 KeybdInput(VK_CONTROL, KEYEVENTF_KEYUP);  //
 SendInput(KeyInputCount, KeyInputs[0], SizeOf(KeyInputs[0]));
end;

procedure SendCtrEnd;
var
 KeyInputs: array of TInput;
 KeyInputCount: Integer;

 procedure KeybdInput(VKey: Byte; Flags: DWORD);
 begin
   Inc(KeyInputCount);
   SetLength(KeyInputs, KeyInputCount);
   KeyInputs[KeyInputCount - 1].Itype := INPUT_KEYBOARD;
   with  KeyInputs[KeyInputCount - 1].ki do
   begin
     wVk := VKey;
     wScan := MapVirtualKey(wVk, 0);
     dwFlags := KEYEVENTF_EXTENDEDKEY;
     dwFlags := Flags or dwFlags;
     time := 0;
     dwExtraInfo := 0;
   end;
 end;
begin
 KeyInputCount:=0;
 KeybdInput(VK_CONTROL, 0);                // Ctrl
 KeybdInput(VK_END, 0);                 // Y
 KeybdInput(VK_END, KEYEVENTF_KEYUP);   //
 KeybdInput(VK_CONTROL, KEYEVENTF_KEYUP);  //
 SendInput(KeyInputCount, KeyInputs[0], SizeOf(KeyInputs[0]));
end;


Проблема в том, что без Slip"ов строки передаются в окна, как Бог на душу положит - могут передаться, не передаться, передаться с ошибкой.
Уважаемые Мастера, не знает ли кто - а почему, собственно?
Спасибо.


 
Сергей М. ©   (2009-02-22 16:56) [1]

Ужас какой ...
А где собственно ты используешь значение хэндла окна, передаваемое тебе параметром в твою колбэк-функцию EnumChildWindowsProc ?


 
Новичек   (2009-02-22 17:03) [2]

Вот здесь: hWND := FindWindowEx(hMDI, 0, nil, Buffer);


 
Сергей М. ©   (2009-02-22 17:06) [3]


> Вот здесь


Это чего ты делаешь в этой строчке ?!

Какое еще окно ты собрался искать, если параметром hWnd тебе уже передан хэндл очередного перечисляемого окна в списке существующих окон, родителем которых является окно hMdШ ?


 
Новичек   (2009-02-22 17:22) [4]

Хм... Чего-то я напартачил... Сейчас разберусь.


 
Новичек   (2009-02-22 17:27) [5]

Ну да, действительно - масло масляное :)


 
Сергей М. ©   (2009-02-22 17:33) [6]

Угу.

- Нате вам масло..
- Не, мне масло не надо, я хочу масло !

))


 
Новичек   (2009-02-22 17:36) [7]

Спасибо :)


 
Сергей М. ©   (2009-02-22 17:38) [8]


> Новичек


Задача колбэк-функции - получить хэндл, быстро положить его куда-нибудь куда ей скажут, например, в некий результирующий список, и быстро же вернуть управление.

А основную работу с результирующим списком следует осуществлять после возврата из Enumchildwindows.



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

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

Наверх




Память: 0.49 MB
Время: 0.015 c
15-1234438605
Кто б сомневался
2009-02-12 14:36
2009.04.12
МВД запретило пользоваться псевдонимами


15-1234428505
Bless
2009-02-12 11:48
2009.04.12
Вопрос шахматистам.


15-1234183264
OlegNik
2009-02-09 15:41
2009.04.12
Как узнать сколько ВЗУ (флешек) в компе?


3-1219063290
kirillrepin
2008-08-18 16:41
2009.04.12
Заполнение DBListBox при помощи StoredProc


15-1234630411
Маэстро
2009-02-14 19:53
2009.04.12
Ламерский вопрос%)