Últimas notícias

Tutorial.: Desativando o botão X (Fechar) em linguagem C


Alguns de vocês, queridos leitores, interessados e entusiastas na área do desenvolvimento de sistemas já devem ter se deparado com pequenas (ou grandes) tarefas que podem até parecer simples mas, na realidade, tem sido quase impossível de encontrar um material explicativo e de qualidade na web.
Pensando em vocês, o Reduto NERD inaugura hoje o primeiro post da série Tutoriais de Programação.

Ao começar a desenvolver um software, é extremamente necessário ter a consciência de quem é pessoa que vai usar o sistema.
Sabemos que, muitas vezes, os usuários podem ser um verdadeiro problema quando se está desenvolvendo um software.
Tudo tem que ser pensado para bloquear ou evitar qualquer erro na utilização do sistema.

Ensinamos então, uma forma simples em linguagem C para evitar que o usuário feche o programa clicando no X

Para compreender melhor o que irá ocorrer ao longo do código, vejam como é uma tela comum do prompt de comando:




Percebam que o menu, acessado ao clicar no ícone da tela (atalho Alt+Espaço), contém diversas linhas, inclusive a linha que fecharia o programa. Nosso objetivo com este tutorial é remover esta linha do menu, o que resultará a desativação do botão X no canto superior direito transformando:

em


Vamos então ao código:
#define _WIN32_WINNT 0x0601
/* Indica a versão NT do sistema operacional
 * A versão correta não é obrigatória mas a linha sim, é necessária para funcionar...
 * Windows 7 é a versão 6.1, logo, 0601
 * (Win7 = 0x0601, WinXP = 0x0501, etc...)
 * É possível checar com o comando 'ver' no prompt
*/


#include <stdio.h>
#include <windows.h> //Possui as funções necessárias

int main(){
    HWND hnd;
    HMENU menu;
    int i, j, cont;
    LPTSTR buffer;

    // Recebe o handle do console
    hnd = GetConsoleWindow();

    // Recebe o handle para o menu do sistema
    menu = GetSystemMenu(hnd, 0);

    // Recebe quantos itens tem no menu
    cont = GetMenuItemCount(menu);

    j = -1;

    // Alocando espaço para receber a string que "não sabemos" o tamanho
    buffer = (TCHAR*) malloc (256 *sizeof(TCHAR));

    for (i=0; i<cont; i++) {
        // Recebe a string do menu, na posição "i" e a coloca no buffer
        GetMenuString(menu, i, buffer, 255, MF_BYPOSITION);
    //Compara se a string do menu é igual a string "Fechar"
        if (!strcmp(buffer, "&Fechar")) {
            j = i;
            break;
        }
    }
    // Se a string "Fechar" for encontrada, remove do menu
    if (j >= 0)
        RemoveMenu(menu, j, MF_BYPOSITION);

    return 0;
}


É importante saber que a linha...
if (!strcmp(buffer, "&Fechar")) {
...que compara a string "Fechar" é completamente dependente do idioma do Windows. Isto é, se você possui um sistema operacional em inglês, a string buscada também vai ser em inglês. Neste caso basta alterar a linha para:
if (!strcmp(buffer, "&Close")) {


Após a implementação deste código, assim ficará a janela que estamos esperando:


Reparem que, não só o X foi desativado, como a opção "Fechar" também foi abolida do menu.

Este tutorial também serve para todas as outras opções do menu caso queiram desativar também a maximização e minimização da janela. Vai de acordo com a criatividade e necessidade para com o sistema.
Ainda será possível fechar o programa pelos atalhos Ctrl+C e Ctrl+Break ou mesmo pelo Gerenciador de Tarefas.

Esperamos que tenham gostado!
Mandem suas dúvidas e sugestões para que possamos compartilhar com a nossa comunidade.


Fiquem atentos para mais dicas e tutoriais, aqui mesmo, no Reduto NERD!

8 comments:

  1. não ta funcionando '-'

    ReplyDelete
  2. Muito interessante! Sou iniciante e cada dia mais amo essa linguagem!

    ReplyDelete
  3. Estranho, Gabriel! Você tem certeza que possui todas as bibliotecas necessárias? Era para estar funcionando, visto que o código é bem simples e todas as funções utilizadas estão definidas nas bibliotecas utilizadas.

    ReplyDelete
  4. É isso aí, Thiago! C e C++ são linguagens muito bacanas, vale a pena investir no aprendizado! ;-)

    ReplyDelete
  5. nao estou conseguindo, ele abre normal e o fechar nao funciona

    ReplyDelete
  6. Então funcionou!!!

    ReplyDelete
  7. Muito Legal, Funfou Bacana

    ReplyDelete