Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2009.04.12;
Скачать: [xml.tar.bz2];

Вниз

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

 
Новичек   (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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.006 c
15-1234260459
vajo
2009-02-10 13:07
2009.04.12
Какой самый производительный проц подойдет к материнке?


15-1234438591
Урсулапов_
2009-02-12 14:36
2009.04.12
Как узнать описание имени компьютера в сети?


15-1234515144
Юрий Зотов
2009-02-13 11:52
2009.04.12
Черная пятница


13-1123688943
DiamondShark
2005-08-10 19:49
2009.04.12
Unmanaged interop


15-1234445454
desc
2009-02-12 16:30
2009.04.12
Как корректно реализовать цикл по датам ?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский