2015-11-25 2 views
1

Я пытаюсь использовать findwindow api call в FM, я могу использовать его в приложении VCL, но не в FM.FindWindow в FM

Вот мой код

function WindowExists(titlename: string): boolean; 
    var 
     hwd: THandle; 
    begin 
     hwd := 0; 
     hwd := FindWindow(nil, pchar(titlename)); 
     Result := False; 
     if not(hwd = 0) then { window was found if not nil } 
     Result := True; 
    end; 

и вот ошибка, я получаю, когда я пытаюсь скомпилировать [dcc32 Error] global_proc.pas (62): E2010 Несовместимые типы: 'HWND' и 'Pointer'

Что я делаю неправильно?

+0

Полностью не связана с FMX. Проблема заключается в некогерентности в Windows API. С типом дескриптора окна и общим типом дескриптора. –

+0

@Free Вряд ли. Проблема в том, что 'FindWindow' здесь' FMX.Platform.Win.FindWindow'. –

ответ

3

Похоже, что ваша проблема заключается в том, что ваш код находит FMX.Platform.Win.FindWindow, а не Winapi.Windows.FindWindow. Кроме того, FindWindow возвращает HWND, а не THandle.

Ваш код должен выглядеть так:

function WindowExists(const TitleName: string): Boolean; 
var 
    wnd: HWND; 
begin 
    wnd := Winapi.Windows.FindWindow(nil, PChar(TitleName)); 
    Result := wnd <> 0; 
end; 

или даже

function WindowExists(const TitleName: string): Boolean; 
begin 
    Result := Winapi.Windows.FindWindow(nil, PChar(TitleName)) <> 0; 
end; 

Обратите внимание, что это всегда бессмысленно писать код так:

A := 0; 
A := 1; 

Это то, что ваш в сущности, в первых двух строках функции. Также идиоматично использовать не равный оператор <> вместо того, чтобы отрицать равный оператор.

+0

это отличная помощь, спасибо. –

+0

Не могли бы вы рассказать мне, существует ли это окно, как отправить сообщение восстановления? –

+0

Это другой вопрос –