001package conexp.fx.gui.util; 002 003/* 004 * #%L 005 * Concept Explorer FX 006 * %% 007 * Copyright (C) 2010 - 2023 Francesco Kriegel 008 * %% 009 * This program is free software: you can redistribute it and/or modify 010 * it under the terms of the GNU General Public License as 011 * published by the Free Software Foundation, either version 3 of the 012 * License, or (at your option) any later version. 013 * 014 * This program is distributed in the hope that it will be useful, 015 * but WITHOUT ANY WARRANTY; without even the implied warranty of 016 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 017 * GNU General Public License for more details. 018 * 019 * You should have received a copy of the GNU General Public 020 * License along with this program. If not, see 021 * <http://www.gnu.org/licenses/gpl-3.0.html>. 022 * #L% 023 */ 024 025 026import com.sun.jna.Native; 027import com.sun.jna.NativeLong; 028import com.sun.jna.Pointer; 029import com.sun.jna.WString; 030import com.sun.jna.ptr.PointerByReference; 031 032public class AppUserModelIdUtility { 033 034 static { 035 Native.register("shell32"); 036 } 037 038 private static native NativeLong GetCurrentProcessExplicitAppUserModelID(PointerByReference appID); 039 040 private static native NativeLong SetCurrentProcessExplicitAppUserModelID(WString appID); 041 042 // DO NOT DO THIS, IT'S JUST FOR TESTING PURPOSE AS I'M NOT FREEING THE MEMORY 043 // AS REQUESTED BY THE DOCUMENTATION: 044 // 045 // http://msdn.microsoft.com/en-us/library/dd378419%28VS.85%29.aspx 046 // 047 // "The caller is responsible for freeing this string with CoTaskMemFree when 048 // it is no longer needed" 049 public static final String getCurrentProcessExplicitAppUserModelID() { 050 final PointerByReference r = new PointerByReference(); 051 052 if (GetCurrentProcessExplicitAppUserModelID(r).longValue() == 0) { 053 final Pointer p = r.getValue(); 054 055 return p.getString(0, true); // here we leak native memory by lazyness 056 } 057 return "N/A"; 058 } 059 060 public static final void setCurrentProcessExplicitAppUserModelID(final String appID) { 061 if (SetCurrentProcessExplicitAppUserModelID(new WString(appID)).longValue() != 0) 062 throw new RuntimeException("unable to set current process explicit AppUserModelID to: " + appID); 063 } 064 065}