본문 바로가기
블로그 이미지

방문해 주셔서 감사합니다! 항상 행복하세요!

  
   - 문의사항은 메일 또는 댓글로 언제든 연락주세요.
   - "해줘","답 내놔" 같은 질문은 답변드리지 않습니다.
   - 메일주소 : lts06069@naver.com


Node.js/Electron

일렉트론으로 만든 단순 알림 프로그램(윈도우 알림)

야근없는 행복한 삶을 위해 ~
by 마샤와 곰 2021. 7. 2.

일렉트론을 활용하여 윈도우 알림프로그램을 만들어 보았습니다.

기능 자체는 어렵지 않으며, 매우 간단하게 구현하였습니다.

사용자가 시간을 입력하고, 입력된 시간에 맞추어 alert 메시지가 뜨는 프로그램 입니다.

먼저 메인 파일 입니다.

* 파일이름 : main.js

const {app, BrowserWindow} = require('electron');

function createWindow() { // 브라우저 창을 생성
    let win = new BrowserWindow({
        fullscreen: false,
        width: 385,
        height: 280,
        webPreferences: {
            nodeIntegration: true,
            contextIsolation: false,
            enableRemoteModule: true
        }
    })
    //메뉴 가리기
    win.setMenu(null)
    // 브라우저창이 읽어 올 파일 위치
    win.loadFile('./index.html')
}

app.on('ready', createWindow);

 

webPreferences에 옵션 값을 주어서 index.html에서 require 명령어가 동작하게 하였습니다.

보안목적상 좋지는 않으나 워낙 간단한 기능이라 이처럼 pre-load 방식이 아니라 직접 접근하는 방식으로 하였습니다.

다음으로 실제 동작하는 html 파일 입니다.

* 파일이름 : index.html

<!doctype html>
<html lang="en-US">
<head>
	<meta charset="UTF-8">
	<meta name="description" content="">
	<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
    <link rel="stylesheet" href="https://code.jquery.com/ui/1.11.4/themes/smoothness/jquery-ui.css">
    <script src="https://code.jquery.com/jquery.min.js"></script>
    <script src="https://code.jquery.com/ui/1.11.4/jquery-ui.min.js"></script>
    
    <link rel="stylesheet" href="https://pro.fontawesome.com/releases/v5.10.0/css/all.css" integrity="sha384-AYmEC3Yw5cVb3ZcuHtOA93w35dYTsvhLPVnYs9eStHfGJvOvKxVfELGroGkvsg+p" crossorigin="anonymous"/>
    <link href="https://stackpath.bootstrapcdn.com/bootstrap/5.0.0-alpha2/css/bootstrap.min.css" rel="stylesheet" crossorigin="anonymous">
	<link rel="shortcut icon" href="my_icon.ico">
    <title>심플타이머</title>
    <style>
        .explainer{
            color: #a0a0a0;
            padding-left: 0.5rem;
            padding-top: 0.5rem;
            font-size: 1.1rem;
            font-weight: bold;
        }
        textarea{
            display:inline-block;
            vertical-align:middle;
            text-align: center;
        }        
    </style>
</head>
<body class="row align-items-center" style="padding : 1.5rem;overflow: hidden;background-image: url(loginBack.jpg);background-repeat: none;background-size: cover;">
    <div class='col-12'>
        <input type="text" value="" id='minValue' class='form-control' style="height: 3rem;text-align: center;font-size: 1.5rem;" placeholder="시간을 입력하세요(분단위)"/>
        <br>
        <table style="width: 100%;height: 3rem;">
            <tr>
                <td class='form-control' id='viewVaule' style="vertical-align: middle;text-align: center;font-size: 1.5rem;"></td>
            </tr>
        </table>
        <br>
        <button type="button" class='btn btn-success' onclick="start()">시작</button>
        <button type="button" class='btn btn-warning' onclick="stop()">중지</button>
        
        <div id='explain' class='explainer' style="display: none;"></div>
    </div>
</body>
</html>
<script>
const { ipcRenderer } = require('electron');
const { dialog } = require('electron').remote; 
const options = {
    type: 'question',  //종류
    buttons: ['Yes'],  //버튼 스타일
    defaultId: 2,  //고유 아이디
    title: '알림!',  //제목
    message: '시간이 다 되었습니다.',
    detail: '',
    checkboxChecked: false,  //체크박스(메시지를 저장합니다 이런 기능)
};


let interVal = null
let gap = 0

function start(){
    let val = $('#minValue').val()
    if(val ==='' || isNaN(val)) {
        $('#explain').addClass('explainer').text('숫자만 입력하여 주세요 👻').fadeIn(1000, function(){
            $(this).fadeOut()
        })
        $('#minValue').focus()
        return
    }
    if(!interVal){
        $('#minValue').val('동작시간 : '+val + '분')
        interVal = setInterval( ()=>{
            if(gap >= 60 * val){ 
                options.detail = val + '분이 되었습니다.'
                dialog.showMessageBox(null, options).then(function(res){

                });                
                gap = 0
            }
            gap = gap + 1
            $('#viewVaule').text(gap+'초')
            console.log(gap)
        }, 1000)
    } else {
        $('#explain').addClass('explainer').text('이미 실행중입니다. 중지만 할 수 있습니다 👻').fadeIn(1000, function(){
            $(this).fadeOut()
        })
    }
}

function stop(){
    if(!interVal){
        $('#explain').addClass('explainer').text('현재 동작하고 있지 않습니다 👻').fadeIn(1000, function(){
            $(this).fadeOut()
        })
    } else {
        clearInterval(interVal)
        $('#viewVaule').text(0)
        interVal = null
        gap = 0
    }
}


</script>

 

부트스트랩과 Jquery를 통해서 간단하게 입력값을 받아서 계산한 뒤에 alert 창을 띄우도록 하였습니다.

이제 이를 빌드하여 실행하여 봅니다.

실행 모습입니다!

 

실제로 잘 동작하고 간단하게 쓰기엔 괜찮은 듯 합니다.

아래 제 깃헙에서 소스코드를 받을 수 있습니다.   * 이름 : 일렉트론타이머

https://github.com/TaeSeungRyu/sample

 

* 용량이 50메가로 크고 exe형식의 파일로 만들어져서 따로 파일이 업로드 되지 않는 점 양해부탁 드립니다.

* 설치 및 빌드 방법 (CMD에서 실행하여야 합니다, 그리고 Node.js가 설치 되어 있어야 합니다)

 1. 소스코드를 디렉토리를 만들어 받는다.

 2. 명령어 입력 : npm init

 3. 명령어 입력 : npm run build:win64

 

이상으로 간단하게 소개한 일렉트론으로 만든 단순 알림 프로그램(윈도우 알림) 이였습니다.

궁금한점 또는 틀린부분, 파일이 필요하시면 메일 또는 댓글로 알려주세요. 👻

 

반응형
* 위 에니메이션은 Html의 캔버스(canvas)기반으로 동작하는 기능 입니다. Html 캔버스 튜토리얼 도 한번 살펴보세요~ :)
* 직접 만든 Html 캔버스 애니메이션 도 한번 살펴보세요~ :)

댓글