Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.03.2011, 23:32   #1
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию D2010. AV(@LStrAddRef) в функии поиска окон по части зоголовка

Всем привет!

Возникла проблема вот с такой функцией:
Код:
function FindWindowByShortName(StartHWND: HWND; AString: string): HWND;
var
  Buffer: array[0..255] of char;
begin
  Result := StartHWND;
  repeat
    Result := FindWindowEx(0, Result, nil, nil);
    GetWindowText(Result, Buffer, SizeOf(Buffer));
    if StrPos(StrUpper(Buffer), PChar(UpperCase(AString))) <> nil then
      Break;
  until (Result = 0);
end;
Ищет окна по части заголовка....

Вот что выдаёт MadExcept:
Код:
main thread ($13dc):
004070c0 +004 HLR.exe    System              15127  +2 @LStrAddRef
006990a2 +01a HLR.exe    HLRMiscUnit            20  +0 FindWindowByShortName
00699e7e +05a HLR.exe    HLRErrorWindowClass   228  +5 TErrorWindowsList.OnMyTimer

disassembling:
004070bc       public System.@LStrAddRef:       ; function entry point
004070bc 15125   test    eax, eax
004070be 15126   jz      loc_4070ca
004070be
004070c0 15127 > mov     edx, [eax-8]            ;<<--EXCEPTION
004070c3 15128   inc     edx
004070c4 15129   jle     loc_4070ca
004070c4
004070c6 15130   lock inc dword ptr [eax-8]
004070c4 15129
004070ca       loc_4070ca:
004070ca 15132   ret
на D7 функция работает на ура...

Первым параметром указываю 0 (Рабочий стол), вторым кусок текста
Человек_Борща вне форума Ответить с цитированием
Старый 21.03.2011, 01:14   #2
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Цитата:
на D7 функция работает на ура...
А на чём она НЕ работает - предлагается угадать?

Угадываю:
Цитата:
nMaxCount [in]
Type: int

The maximum number of characters to copy to the buffer, including the null character. If the text exceeds this limit, it is truncated.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 21.03.2011, 08:43   #3
ArtGrek
DelphiProger
Участник клуба
 
Аватар для ArtGrek
 
Регистрация: 14.11.2010
Сообщений: 1,023
По умолчанию

вот так попробуи
Код:
function FindAWindow(fCaption : string) : THandle;
             var
               WindowInfo : TFindWindowStruct;
             begin
               with WindowInfo do 
               begin
                 Caption := fCaption;
                 WindowHandle := 0;
                 EnumWindows(@EnumWindowsProc, LongInt(@WindowInfo));
                 FindAWindow := WindowHandle;
               end;
             end;
VirusN13
ArtGrek вне форума Ответить с цитированием
Старый 23.03.2011, 18:15   #4
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

Цитата:
Сообщение от ArtGrek Посмотреть сообщение
вот так попробуи
Код:
function FindAWindow(fCaption : string) : THandle;
             var
               WindowInfo : TFindWindowStruct;
             begin
               with WindowInfo do 
               begin
                 Caption := fCaption;
                 WindowHandle := 0;
                 EnumWindows(@EnumWindowsProc, LongInt(@WindowInfo));
                 FindAWindow := WindowHandle;
               end;
             end;
А что такое TFindWindowStruct и EnumWindowsProc я должен угадать?
Человек_Борща вне форума Ответить с цитированием
Старый 23.03.2011, 18:35   #5
ArtGrek
DelphiProger
Участник клуба
 
Аватар для ArtGrek
 
Регистрация: 14.11.2010
Сообщений: 1,023
По умолчанию

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ShellApi, StdCtrls;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

type
  PFindWindowStruct = ^TFindWindowStruct;
  TFindWindowStruct = record
    Caption : string;
    WindowHandle : THandle;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function EnumChildWindowsProc(hWindow : hWnd; lParam  : LongInt) : Bool
             {$IFDEF Win32} stdcall; {$ELSE} ; export; {$ENDIF}
             var
               lpBuffer : PChar;
               WindowCaptionFound : bool;
             begin
               GetMem(lpBuffer, 255);
               Result := True;
               WindowCaptionFound := False;
              
               try
                 if GetWindowText(hWindow, lpBuffer, 255) > 0 then
                   if Pos(pChar('Start'), StrPas(lpBuffer)) > 0
                    then WindowCaptionFound := true;
                 if WindowCaptionFound  then begin
                   PFindWindowStruct(lParam).WindowHandle := hWindow; 
                   Result := False;
                 end;

               finally
                 FreeMem(lpBuffer, sizeof(lpBuffer^));
               end;
             end;
             
function EnumWindowsProc(hWindow : hWnd; lParam  : LongInt) : Bool
             {$IFDEF Win32} stdcall; {$ELSE} ; export; {$ENDIF}
             var
               lpBuffer : PChar;
               WindowCaptionFound : bool;
             begin
               GetMem(lpBuffer, 255);
               Result := True;
               WindowCaptionFound := False;
              
               try
                 if GetWindowText(hWindow, lpBuffer, 255) > 0 then
                   if Pos(PFindWindowStruct(lParam).Caption, StrPas(lpBuffer)) > 0
                    then WindowCaptionFound := true;


                 if WindowCaptionFound  then begin
                   PFindWindowStruct(lParam).WindowHandle := hWindow; 
                   Result := False;
                 end;

               finally
                 FreeMem(lpBuffer, sizeof(lpBuffer^));
               end;
             end;

function FindAWindow(fCaption : string) : THandle;
             var
               WindowInfo : TFindWindowStruct;
             begin
               with WindowInfo do begin
                 Caption := fCaption;
                 WindowHandle := 0;
                 EnumWindows(@EnumWindowsProc, LongInt(@WindowInfo));
                 FindAWindow := WindowHandle;
               end;
             end;


function FindYarus(fhwnd : THandle) : THandle;
             var
               WindowInfo : TFindWindowStruct;
             begin
               with WindowInfo do begin
                 Caption := 'Start'; // указываем, то что написано на искомой кнопке      

                 WindowHandle := 0;
                 EnumChildWindows(fhwnd, @EnumChildWindowsProc, LongInt(@WindowInfo));
                 EnumWindows(@EnumWindowsProc, LongInt(@WindowInfo));
                 FindYarus := WindowHandle;
               end;
             end;


procedure TForm1.Button1Click(Sender: TObject);
 var TheWindowHandle : THandle;
     TheYarusWindowHandle : THandle;
begin
  TheWindowHandle := FindAWindow('UPassChanger');// указываем слово в заголовке главного окна
               if TheWindowHandle = 0 then
                 ShowMessage('Window Not Found1!')
                 else
                 begin
                 BringWindowToTop(TheWindowHandle);
TheYarusWindowHandle :=FindYarus(TheWindowHandle);
                 end;
if TheYarusWindowHandle = 0 then
                 ShowMessage('Window Not Found2!')
                 else PostMessage(TheYarusWindowHandle, BM_CLICK, 0, 0);
end;

end.
VirusN13
ArtGrek вне форума Ответить с цитированием
Старый 23.03.2011, 20:18   #6
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

Благодарен за исчерпывающий ответ. +
Человек_Борща вне форума Ответить с цитированием
Старый 24.03.2011, 01:38   #7
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

А знаешь почему у него работает, а у тебя - нет?

Потому что у него:
Код:
GetWindowText(hWindow, lpBuffer, 255);
а у тебя:
Код:
GetWindowText(Result, Buffer, SizeOf(Buffer));
Ещё раз вдумчиво читаем это:
Цитата:
nMaxCount [in]
Type: int

The maximum number of characters to copy to the buffer, including the null character. If the text exceeds this limit, it is truncated.
И отвечаем на вопрос - чему равно SizeOf(Buffer)?

P.S. Это не значит, что надо использовать константу 255, но у нас есть Length.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Программа на СИ...выдает ошибку в функии... VIKA1829 Помощь студентам 10 27.02.2011 21:19
Реализация функии вероятностей? VintProg Общие вопросы Delphi 7 04.10.2010 18:16
Справка для функии пользователья barbus Microsoft Office Excel 2 22.05.2010 12:26
активировать уже открытое приложение (одно из окон) по части названия и его корректно закрыть Yuri_K Microsoft Office Excel 1 25.11.2009 23:47
активировать уже открытое приложение (одно из окон) по части названия и его корректно закрыть Yuri_K JavaScript, Ajax 0 25.11.2009 22:26