Главная страница
    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.005 c
2-1235026821
CodeMaster
2009-02-19 10:00
2009.04.12
C++ to Delphi


11-1199545801
tim128
2008-01-05 18:10
2009.04.12
Обработка ошибок под WinCE


2-1235452145
vegarulez
2009-02-24 08:09
2009.04.12
вопрос связи поток и DataModule


4-1208257306
Petrovich
2008-04-15 15:01
2009.04.12
Закрытие другой копии программы.


2-1232632697
vlasov
2009-01-22 16:58
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский