인프런 커뮤니티 질문&답변

jh님의 프로필 이미지
jh

작성한 질문수

자바(javafx) 실전 데스크탑앱 프로젝트 - 유튜브관리앱

프로세스하나만 띄우기가 안되어서요.

작성

·

551

0

위쪽에 checkIfRunning(): 선언했구요. 

예제로 했던 WarningStudy를 실행하고 나면 경고창이 뜨긴하는데... 

위 프로그램을 한번 실행하고 두번째 실행,세번째 실행해도 경고창이 실행이 안되어서요. 

답변 10

0

김래옥님의 프로필 이미지
김래옥
지식공유자

메일 받아보았습니다.

win32방법적용하실 때

"primaryStage.setTitle("유트브앱");" 이 아니라 

"primaryStage.setTitle("유튜브앱");" 입니다.

아래코드의 "유튜브앱"과 일치시키셔야 합니다.

"HWND hwnd = User32.INSTANCE.FindWindow(null, "유튜브앱");"

------------------------------------------------------------------------------------

두 가지 방법 모두,  "빈 창"에서 작동이 되었다면, 한글경로때문에 문제가 발생한 것 같지는 않습니다.

("빈 창"역시 한글경로가 들어가 있다고 가정할 때입니다.

그래도 혹시 모르니 파일경로에 한글이 포함되어 있지 않도록 하시고, 파일이름도 한글로 짓지 않도록 하세요.)

---------------------------------------------------------------------------------------

마지막으로 해 볼수 있는 행동은

유튜브앱코드쪽에서 "빈 창"코드쪽(정상으로 작동 되는 쪽)으로 부분적으로 하나씩 옮기면서 실행시켜보는 겁니다.

하나씩 옮길 때마다 실행시키는 겁니다.

그리고 어느 부분에서 작동이 되지 않는 지 확인해주세요.

일단 메일로 제가 작성한 포트가 들어간 코드를 보냈습니다.

(파일을 이클립스안으로 통으로 이동시키시면,

첫 라인의 주석을 참고해서, 빨간색 표시가 뜨는 아이콘을 클릭한 후  "Add package~"를 더블클릭해서 선택합니다.)

0

jh님의 프로필 이미지
jh
질문자

네 알겠습니다.

0

김래옥님의 프로필 이미지
김래옥
지식공유자

작성하신 유튜브앱 전체코드를 ---------@gmail.com(비공개로 전환함)로 보내주세요.

0

jh님의 프로필 이미지
jh
질문자

위 2가지 방법 각자 하면 두번째 실행시 경고창이 잘 뜨는데... 유트브앱에다 복사하면 프로세스가 계속 실행되고 경고창이 뜨질 않네요 ㅠ.ㅠ

0

김래옥님의 프로필 이미지
김래옥
지식공유자

만약 위처럼 해도 정말로 작동이 안된다면,  win32(윈도우즈프로그래밍)방법을 소개하겠습니다.

1.아래의 라이브러리 2개를 모두 다운받고, lib폴더로 이동시킨 후 등록시킵니다.

jna라이브러리(첫번째)

jna라이브러리(두번째)

2.아래와 같이 코드를 작성합니다.

복사붙여넣기용

import javafx.application.Application;
import javafx.scene.control.Alert;
import javafx.scene.control.Alert.AlertType;
import javafx.scene.image.Image;
import javafx.stage.Stage;

import com.sun.jna.platform.win32.User32;
import com.sun.jna.platform.win32.WinDef.HWND;

public class ProblemTest extends Application {

	@Override
	public void start(Stage primaryStage) {

		
		checkIfRunning();

		primaryStage.show();
		primaryStage.setTitle("유튜브앱");
	}

	public static void main(String[] args) {
		launch(args);
	}

	public void checkIfRunning() {
		try {

			HWND hwnd = User32.INSTANCE.FindWindow(null, "유튜브앱");

			// "동일한 앱타이틀"을 가진 프로세스가 존재하면 경고창 띄우기 
			if (hwnd != null) {

				System.out.println("이미 실행중");

				Alert alert = new Alert(AlertType.INFORMATION);

				Stage stage = (Stage) alert.getDialogPane().getScene().getWindow();
				stage.getIcons().add(new Image(getClass().getResourceAsStream("assets/warning.png")));
				alert.setTitle("Warning");
				alert.setHeaderText("이미 유튜브앱이 실행중입니다.");
				alert.showAndWait();

				System.exit(1);

			}

		} catch (Exception e) {

			System.out.println("JNA 에러");

		}
	}

}

0

김래옥님의 프로필 이미지
김래옥
지식공유자

빈 창으로 프로세스를 한 번만 실행시키는 코드입니다.

(안되면 포트번호도 한 번 바꿔보시구요. 이것 저것 시도해보는 게 중요합니다.)

제대로 작동한다면 이를 유튜브앱소스에 끼워넣으시면 됩니다.

복사붙여넣기용 코드

public class ProblemTest extends Application {

	int port = 9900;

	@Override
	public void start(Stage primaryStage) {
		
		checkIfRunning();

		primaryStage.show();
		
	}

	public static void main(String[] args) {
		launch(args);
	}
	
	//warning이미지 파일이 assets폴더안에 있지 않으면 에러가 납니다. 이미지파일을 올바른 위치에 두셔야 합니다.
	public void checkIfRunning() {
		try {
			ServerSocket socket = new ServerSocket(port, 0, InetAddress.getByAddress(new byte[] { 127, 0, 0, 1 }));
			
			System.out.println("9900포트할당");
			
		} catch (Exception e) {

			System.out.println("이미 실행중");

			Alert alert = new Alert(AlertType.INFORMATION);

			Stage stage = (Stage) alert.getDialogPane().getScene().getWindow();
			stage.getIcons().add(new Image(getClass().getResourceAsStream("assets/warning.png")));
			alert.setTitle("Warning");
			alert.setHeaderText("이미 유튜브앱이 실행중입니다.");
			alert.showAndWait();

			System.exit(1);

		}
	}
	
}

0

jh님의 프로필 이미지
jh
질문자

계속 하나의 프로세스만 실행되지 않네요~ 전체 코드를 한 번 살펴 봐 주실 수 있나요?? 

0

김래옥님의 프로필 이미지
김래옥
지식공유자

exe파일이 있는 위치에서 assets폴더를 만드시고 그 안에 list.asx파일을 생성하시면 됩니다. 이클립스환경과 동일하게 맞춰주면 됩니다.

프로세스문제는 분명 예제가 제대로 작동했으니까 해결될 거라고 생각하는 데요.

계속 포트할당메세지가 뜨는 건가요?

0

jh님의 프로필 이미지
jh
질문자

위 처럼 했는데 해결이 안되네요...

그리고 마지막까지 강의를 들었는데  유트앱관리 중간에 실행파일 만들기가 있고 팟플레이까지 한거까지 실행파일로 만들고 싶거든요. 방법 관련해서 설명 부탁드려요. 

0

김래옥님의 프로필 이미지
김래옥
지식공유자

일단, 콘솔탭(Console) 화면부분에서 마우스 오른쪽 클릭해서 나오는 옵션인 Terminate/Disconnect All을 선택해서

모든 프로세스를 종료시켜주시고 다시 한번 테스트해보세요.

jh님의 프로필 이미지
jh

작성한 질문수

질문하기