2016-06-11 9 views
-1

Если вы создаете приложение Delphi VCL по умолчанию, у вас есть одна форма VCL, и если вы запустите приложение, на панели задач будет только один значок. После этого, если добавить к нему форму FMX, вы можете иметь обе формы и использовать их оба. но на панели задач, когда приложение работает, есть два значка. Есть ли способ удалить тот, который называется названием проекта, и сохранить его в качестве основной формы?Как удалить дополнительную иконку на панели задач, когда я использую VCL и FMX?

Я использую delphi XE8.

ответ

1

Я нашел ответ. Это смешно. около 2 дней, которые я ищу, и не успел найти ответ после того, как я разместил свой вопрос. Я отвечаю на него сам, может быть, это полезно другому человеку.

Я нашел этот код на этой странице https://github.com/vintagedave/firemonkey-container/blob/master/Parnassus.FMXContainer.pas

function EnumWindowCallback(hWnd: HWND; lParam: LPARAM): BOOL; stdcall; 
const 
    FMXClassName = 'TFMAppClass'; 
var 
    ProcessID : DWORD; 
    ClassName : string; 
    ClassNameLength : NativeInt; 
begin 
    // XE4 (possibly others) show a phantom TFMAppClass window on the taskbar. Hide it. 
    // Ensure the one we hide belongs to this thread/process - don't damage other FMX apps 
    if (GetWindowThreadProcessId(hWnd, ProcessID) = GetCurrentThreadId) and (ProcessID = GetCurrentProcessId) then begin 
    // Thanks to the ubiquitous David Heffernan... http://stackoverflow.com/questions/7096542/collect-all-active-window-class-names 
    SetLength(ClassName, 256); 
    ClassNameLength := GetClassName(hWnd, PChar(ClassName), Length(ClassName)); 
    if ClassNameLength = 0 then RaiseLastOSError; 
    SetLength(ClassName, ClassNameLength); 
    if ClassName = FMXClassName then begin 
     // Found. Hide it, and return false to stop enumerating 
     ShowWindow(hWnd, SW_HIDE); 
     Exit(False); 
    end; 
    end; 
    Result := True; // Fallthrough, keep iterating 
end; 

, если использовать следующий код, чтобы использовать его, другой значок на панели задач будет скрыт

EnumWindows(@EnumWindowCallback, 0); 
+0

Поскольку вы ищете окна в определенном потоке, вы должны использовать ['EnumThreadWindows()'] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms633495.aspx) вместо 'EnumWindows()'. Или просто используйте 'FindWindow()' вместо этого. –