Página 1 de 2

programa em xHarbour chamado via Agendador de Tarefas

Enviado: 24 Out 2011 01:31
por cjp
Pessoal,

Alguém poderia me ajudar com uma questão:

Estou executando um programa a partir do Agendador de Tarefas do Windows XP. É um programa simples, que não leva mais que 10 segundos para rodar.

O problema é que, muitas vezes, o usuário cancela o programa.

Então, eu queria que o programa rodasse invisível, sem janela, sem aparecer na tela.

Será que existe um jeito de o programa rodar sem aparecer na tela?

Inacio

programa em xHarbour chamado via Agendador de Tarefas

Enviado: 24 Out 2011 09:22
por Pablo César
Oi Inacio, uma sugestão para este caso, ao invés de executar invisível (seria em background) por quê não ataca direto o key da questão ?

Se o key da questão é que o usuário interrompe a execução do programa, faça com que o programa não saia se for chamado com um parametro por exemplo:

PROGRAMA /NOEXIT

Outra questão seria desabilitar o "x" da janela e aí então vem a sua questão de executar em modo minimizado através do START /MIN e ja com parâmetro /NOEXIT.

programa em xHarbour chamado via Agendador de Tarefas

Enviado: 24 Out 2011 11:25
por sygecom
ola inacio
procure no forum um post do Rodrigo Moreno ensinando a usar aplicativo como serviço

programa em xHarbour chamado via Agendador de Tarefas

Enviado: 25 Out 2011 00:49
por cjp
Meus caros,

Salvo se eu estiver fazendo algo errado, chamar PROGRAMA /NOEXIT não resolve, não impede que o usuário feche o programa.

Eu tenho uma função que me foi recomendada por alguém do grupo que desabilita o X do programa; funciona corretamente em todos os programas, menos nos programa chamados pelo Agendador de Tarefas do Windows. Não sei porque, mas o mesmo programa, chamado diretamente, funciona. Mas quando eu chamo pelo Agendador de tarefas, não funciona, não desabilita o X.

A função de serviço, eu até já tentei, mas sinceramente, não consegui entender como funciona. Será que alguém poderia me ajudar?

programa em xHarbour chamado via Agendador de Tarefas

Enviado: 25 Out 2011 07:43
por sygecom
Post como está tentando usar que lhe ajudaremos. Qual foi a dificuldade ?

programa em xHarbour chamado via Agendador de Tarefas

Enviado: 25 Out 2011 11:54
por Pablo César
Inacio escreveu:Salvo se eu estiver fazendo algo errado, chamar PROGRAMA /NOEXIT não resolve, não impede que o usuário feche o programa.
Não existe mágica, tudo tem que ser devidamente programado. Inacio, o que eu quis dizer é que você mesmo pode alterar o seu programa para que o usuário não finalize, mesmo o usuário possuindo no programa uma opção de saída de programa: seja com ESC, EXIT, RETURN, QUIT em opção de saída ou pressionando um tecla para encerrar o programa. Como eu não conheço o seu programa, imagino que se ao executá-lo e este não demora mais do que 10 segundos e o usuário consegue fechá-lo é porque deve existir uma saída de programa muito fácil. Daí eu dei a idéia de bloquear tais opções de encerramento de programa quando o parâmetro for /NOEXIT (por exemplo). Isto é, não existe essa diretriz para tal fim, apenas você deve implementa-lo.

Quanto a questão da inibição do botão "x" da janela da sessão, não tenho conhecimento se ela funciona ou não quando é acionado pelo agendador de tarefas.

No HMG, eu colocaria a opção "MAIN NOSHOW" para criar uma janela invisivel (que executa e não mostra nada, nem abre sessão alguma) e ainda em modo console.
Nota de Moderação:
por Moderador: Inacio, você ja não tinha uma conta aqui no forum com o nome de Inacio ? Você abriu uma nova conta cjp ? Qual seria o motivo ?

programa em xHarbour chamado via Agendador de Tarefas

Enviado: 26 Out 2011 00:09
por cjp
O que é HMG?

Eu achei que vc tinha dito que bastaria chamar o programa com a opção /NOEXIT para ele não permitir fechar.

A minha dúvida é justamente como fazer isto, como impedir ao usuário de fechar. Ele está fechando no X da janela mesmo, isso é que eu gostaria de impedir.

Respondendo ao moderador: eu tinha sim um usuário inacio, mas perdi a senha e não consegui recuperar, por isso eu abri um novo usuário.

programa em xHarbour chamado via Agendador de Tarefas

Enviado: 26 Out 2011 08:22
por Itamar M. Lins Jr.
HMG, é a Minigui, uma biblioteca gráfica do Roberto Lopes. E tem suas filhas, a HMG Extended do Filatov, OOHG, Marinas GUI, que eu lembro no momento.
Agora tem a HWGUI do Alexander, que é a lib grafica MÃE da Minigui, serviu de base para a Minigui.

http://hmgforum.com/
http://hmgextended.com/
http://www.oohg.org/
http://www.marinas-gui.org/


Saudações,
Itamar M. Lins Jr.

programa em xHarbour chamado via Agendador de Tarefas

Enviado: 26 Out 2011 08:37
por Pablo César
O que é HMG?
Leia: https://pctoledo.org/forum/viewto ... 43&t=11543
Eu achei que vc tinha dito que bastaria chamar o programa com a opção /NOEXIT para ele não permitir fechar.
Era para implementar isenção de saída de programa quando parâmetro "/NOEXIT" for passado. Exemplo de programa:

Código: Selecionar todos

// Exemplo para evitar saida do programa quando pressionado ESC

Parameters voqfaz

cTipo=Space(10)
Do While .T.
   @ 12,00 SAY "Informe o tipo:" GET cTipo
   Read
   If Lastkey()=27 .and. voqfaz="/NOEXIT"
      Alert("Saida do programa n„o permitida !")
   Else
      Exit
   Endif
Enddo

Use DBF
Do While !EOF()
   IF TIPO=cTipo
      REPLACE PAGO WITH .T.
   ENDIF
   SKIP
Enddo
A minha dúvida é justamente como fazer isto, como impedir ao usuário de fechar. Ele está fechando no X da janela mesmo, isso é que eu gostaria de impedir.
Você tinha dito que tinha uma rotina (imagino em Harbour) que um colega te passou para desabilitar o "x" da janela. Eu não sei qual é a função (se é que tem em Harbour) para desabilitar o "x". Mas posso te indicar o aplicativo WAPI.EXE do Maligno que faz isso muito bem, mas você terá que chamar o seu programa de dentro de uma batch file (arquivo .BAT). Para baixar o Ultima versão do WAPI, clique aqui e leia se inteire de como implementar o SETBUTTONX nestas mensagens: https://pctoledo.org/forum/search ... only&ch=-1, neste momento eu estou indo pro um cliente. Procure se informar até mesmo ler o arquivo WAPI.C que explica as seguintes funções que você irá precisar:
  • -SETBUTTONX
    -GETMYHANDLE
Para poder ajudá-lo melhor, preciso empenho da sua parte. Até agora não ví código algum. Tente implementar as indicações sugeridas e se tiver dúvidas, exemplifique e mostre para nós o que foi tentado e sem êxito. Aqui acostumamos ajudar, mas com isso não quer dizer que entregamos o peixe pronto e servido, gostamos de entregar a vara pra pescar, de preferência com o anzol adequado e você mesmo terá que pescar o seu proprio peixe. Ok, colega ?

programa em xHarbour chamado via Agendador de Tarefas

Enviado: 27 Out 2011 01:40
por cjp
Meu caro,

Peço que entenda que não estou querendo ganhr tudo pronto, nem estou sendo preguiçoso. Apenas sou iniciante nessa área, não sou profissional, e estou fazendo um esforço enorme pra aprender, embora não tenha muito tempo (são quase 2h da manhã, é a hora que eu consigo para me dedicar a isso) e me faltem os conhecimentos básicos.

Instalei a versão da HMG que baixei neste fórum, mas não consegui ainda usá-la. Não sei compilar com ela. Pelo que eu entendi da leitura do fórum recomendada, bastaria usar include <hwgui.ch>, mas aqui não funcionou.

Programei o parâmetro "/NOEXIT" e entendi o que vc disse. Na verdade eu nunca tinha usado parâmetro, por isso não havia entendido o que vc tinha dito, mas agora entendi. Mas, pelo que eu entendi, esse parâmetro não vai impedir o desligamento do programa pelo usuário clicando no X da janela ou fazendo logoff no computador, estou certo?

Vou estudar a WAPI que vc mencionou.

A função que eu disse que desabilita o X da janela (mas que, como eu disse, não funciona quando o programa é chamado via Agendador de Tarefas) é a seguinte:

Código: Selecionar todos

//-> Rotina em C -> By Manuel Mercado

#pragma BEGINDUMP

#include <windows.h>
#include <stdlib.h>
#include <hbapi.h>
#define ID_STARTBUTTON 0x130 // Start button ID
#define ID_TRAY 0x12F // System tray ID
#define ID_CLOCK 0x12F // System clock ID
#define PROGRAM_MANAGER "Program Manager" // Program manager window name
#define TASKBAR "Shell_TrayWnd" // Taskbar class name

int WINAPI TaskManager_Enable_Disable( BOOL ) ;
int WINAPI StartButton_Show_Hide( BOOL ) ;
int WINAPI Desktop_Show_Hide( BOOL ) ;
int WINAPI Process_Desktop(char *, char * ) ;
int WINAPI Taskbar_Show_Hide( BOOL ) ;
int WINAPI Clock_Show_Hide( BOOL ) ;
int WINAPI AltTab_Enable_Disable( HWND, BOOL ) ;
BOOL StartProcess( char *, char * ) ;
LRESULT CALLBACK LowLevelMouseHookProc( int nCode, WORD wParam, DWORD lParam ) ;
LRESULT CALLBACK MouseHookProc( int nCode, WORD wParam, DWORD lParam ) ;

HHOOK hHook ; // Mouse hook
HINSTANCE hInst ; // Instance handle

HB_FUNC( ALTTABENABLE )
{
HWND hWnd = (HWND ) hb_parnl( 1 ) ;
BOOL bEnable = hb_parl( 2 ) ;
int iRet ;

iRet = AltTab_Enable_Disable( hWnd, bEnable ) ;
hb_retni( iRet ) ;
}

HB_FUNC( SHOWCLOCK )
{
BOOL bShow = hb_parl( 1 ) ;
int iRet ;

iRet = Clock_Show_Hide( bShow ) ;
hb_retni( iRet ) ;
}

HB_FUNC( SHOWTASKBAR )
{
BOOL bShow = hb_parl( 1 ) ;
int iRet ;

iRet = Taskbar_Show_Hide( bShow ) ;
hb_retni( iRet ) ;
}

HB_FUNC( DESKTOPPROC )
{
char* c1 = hb_parc( 1 ) ;
char* c2 = hb_parc( 2 ) ;
int iRet ;

iRet = Process_Desktop( c1, c2 ) ;
hb_retni( iRet ) ;
}

HB_FUNC( SHOWDESKTOP )
{
BOOL bShow = hb_parl( 1 ) ;
int iRet ;

iRet = Desktop_Show_Hide( bShow ) ;
hb_retni( iRet ) ;
}

HB_FUNC( STARTBUTTON )
{
BOOL bShow = hb_parl( 1 ) ;
int iRet ;

iRet = StartButton_Show_Hide( bShow ) ;
hb_retni( iRet ) ;
}

HB_FUNC( CTRLALTDEL )
{
BOOL bEnable = hb_parl( 1 ) ;
int iRet ;

iRet = TaskManager_Enable_Disable( bEnable ) ;
hb_retni( iRet ) ;
}

int WINAPI TaskManager_Enable_Disable(BOOL bEnableDisable)
{
#define KEY_DISABLETASKMGR "Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System"
#define VAL_DISABLETASKMGR "DisableTaskMgr"

HKEY hKey;
DWORD val;
LONG r;

if (RegOpenKey(HKEY_CURRENT_USER, KEY_DISABLETASKMGR, &hKey) != ERROR_SUCCESS)
if (RegCreateKey(HKEY_CURRENT_USER, KEY_DISABLETASKMGR, &hKey) != ERROR_SUCCESS)
return 0;

if (bEnableDisable) // Enable
{
r = RegDeleteValue(hKey, VAL_DISABLETASKMGR);
}
else // Disable
{
val = 1;
r = RegSetValueEx(hKey, VAL_DISABLETASKMGR, 0, REG_DWORD, (BYTE *)&val, sizeof(val));
}

RegCloseKey(hKey);

return (r == ERROR_SUCCESS ? 1 : 0) ;
}

int WINAPI StartButton_Show_Hide( BOOL bShowHide )
{
HWND hWnd;

hWnd = GetDlgItem( FindWindow( TASKBAR, NULL ), ID_STARTBUTTON ) ;
if ( hWnd == NULL )
return 0 ;

ShowWindow( hWnd, bShowHide ? SW_SHOW : SW_HIDE) ;
UpdateWindow( hWnd );

return 1 ;
}

int WINAPI Taskbar_Show_Hide( BOOL bShowHide )
{
HWND hWnd;

hWnd = FindWindow( TASKBAR, NULL ) ;
if ( hWnd == NULL )
return 0 ;

ShowWindow( hWnd, bShowHide ? SW_SHOW : SW_HIDE ) ;
UpdateWindow(hWnd) ;

return 1 ;
}

int WINAPI Desktop_Show_Hide( BOOL bShowHide )
{
OSVERSIONINFO osvi ;
BOOL bIsWindowsNT4SP3orLater ;
int iServicePack ;
char *p ;

// Determine the current windows version
osvi.dwOSVersionInfoSize = sizeof( OSVERSIONINFO ) ;
GetVersionEx( &osvi );
for (p = osvi.szCSDVersion; *p && ! isdigit( *p ) ; *p++ ) ;
iServicePack = atoi( p ) ;
bIsWindowsNT4SP3orLater = ( osvi.dwPlatformId == VER_PLATFORM_WIN32_NT ) &&
( ( ( osvi.dwMajorVersion == 4 ) && ( iServicePack >= 3 ) ) ||
( osvi.dwMajorVersion > 4 ) ) ;

if ( ! bShowHide )
{
if ( ! hHook )
{
hHook = SetWindowsHookEx( bIsWindowsNT4SP3orLater ? WH_MOUSE_LL : WH_MOUSE,
bIsWindowsNT4SP3orLater ? ( HOOKPROC )LowLevelMouseHookProc : ( HOOKPROC )MouseHookProc,
hInst, 0 ) ;
if ( ! hHook )
return 0 ;
}
}
else
{
UnhookWindowsHookEx(hHook);
hHook = NULL;
}

return SetWindowPos( FindWindow( NULL, PROGRAM_MANAGER ), NULL, 0, 0, 0, 0,
bShowHide ? SWP_SHOWWINDOW : SWP_HIDEWINDOW | SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER);
}

LRESULT CALLBACK LowLevelMouseHookProc( int nCode, WORD wParam, DWORD lParam )
{
PMSLLHOOKSTRUCT p = (PMSLLHOOKSTRUCT)lParam ;
HWND hWnd = WindowFromPoint( p->pt ) ;

if( nCode >= 0 )
{
if ( ( wParam == WM_LBUTTONDOWN || wParam == WM_RBUTTONDOWN ) && hWnd == GetDesktopWindow() )
{
return 1 ;
}
}

return CallNextHookEx( hHook, nCode, wParam, lParam ) ;
}

LRESULT CALLBACK MouseHookProc( int nCode, WORD wParam, DWORD lParam )
{
if( nCode >= 0 )
{
if ( wParam == WM_LBUTTONDBLCLK )
{
if ( ( ( MOUSEHOOKSTRUCT * )lParam )->hwnd == GetDesktopWindow() )
{
return 1 ;
}
}
}

return CallNextHookEx( hHook, nCode, wParam, lParam ) ;
}

int WINAPI Process_Desktop(char *szDesktopName, char *szPath )
{
HDESK hOriginalThread ;
HDESK hOriginalInput ;
HDESK hNewDesktop ;

// Save original ...
hOriginalThread = GetThreadDesktop( GetCurrentThreadId() ) ;
hOriginalInput = OpenInputDesktop( 0, FALSE, DESKTOP_SWITCHDESKTOP ) ;

// Create a new Desktop and switch to it
hNewDesktop = CreateDesktop( szDesktopName, NULL, NULL, 0, GENERIC_ALL, NULL ) ;
SetThreadDesktop( hNewDesktop ) ;
SwitchDesktop( hNewDesktop ) ;

// Execute process in new desktop
StartProcess( szDesktopName, szPath ) ;

// Restore original ...
SwitchDesktop( hOriginalInput ) ;
SetThreadDesktop( hOriginalThread ) ;

// Close the Desktop
CloseDesktop( hNewDesktop ) ;

return 0 ;
}

BOOL StartProcess( char *szDesktopName, char *szPath )
{
STARTUPINFO si ;
PROCESS_INFORMATION pi ;

// Zero these structs
ZeroMemory( &si, sizeof( si ) ) ;
si.cb = sizeof( si ) ;
si.lpTitle = szDesktopName ;
si.lpDesktop = szDesktopName ;
ZeroMemory( &pi, sizeof( pi ) ) ;

if (!CreateProcess( NULL, szPath, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi ) ) // Pointer to PROCESS_INFORMATION structure.
{
return FALSE ;
}

// Wait until process exits
WaitForSingleObject( pi.hProcess, INFINITE ) ;

// Close process and thread handles
CloseHandle( pi.hProcess ) ;
CloseHandle( pi.hThread ) ;

return TRUE ;
}

int WINAPI Clock_Show_Hide( BOOL bShowHide )
{
HWND hWnd ;

hWnd = GetDlgItem( FindWindow( TASKBAR, NULL ), ID_TRAY ) ;
hWnd = GetDlgItem( hWnd, ID_CLOCK ) ;
if ( hWnd == NULL )
return 0 ;

ShowWindow( hWnd, bShowHide ? SW_SHOW : SW_HIDE ) ;
UpdateWindow( hWnd ) ;

return 1 ;
}

int WINAPI AltTab_Enable_Disable( HWND hWnd, BOOL bEnableDisable )
{
#define m_nHotKeyID 100

if ( ! bEnableDisable )
{
if ( ! RegisterHotKey( hWnd, m_nHotKeyID+0, MOD_ALT, VK_TAB ) ) // Alt+Tab
return 0 ;
if ( ! RegisterHotKey( hWnd, m_nHotKeyID+1, MOD_ALT, VK_ESCAPE ) ) // Alt+Esc
return 0 ;
}
else
{
if ( ! UnregisterHotKey( hWnd, m_nHotKeyID + 0 ) )
return 0 ;
if ( ! UnregisterHotKey( hWnd, m_nHotKeyID + 1 ) )
return 0 ;
}
return 1 ;
}
#pragma ENDDUMP



#pragma BEGINDUMP

#include "windows.h"
#include "shlobj.h"
#include "hbapi.h"
#include "math.h"
#include "hbvm.h"
#include "hbstack.h"
#include "hbapiitm.h"
#include "hbapigt.h"


HB_FUNC ( HIDETASKBAR )     //Desabilita o botao Iniciar
{
  HWND hWnd = FindWindow("Shell_TrayWnd", "");

  ShowWindow( hWnd, 0 );
}

HB_FUNC ( PISCA_EXE )      // VAI PISCAR O SEU EXE NA BARRA
{
    HWND  Handle = GetForegroundWindow();

    FlashWindow(Handle,TRUE); // VAI PISCAR O SEU EXE NA BARRA

    Sleep(300);    // TEMPO DE ESPERA
}


HB_FUNC ( TIRA_X )        // DESABILITA O X da janela

{
    HMENU MenuH = GetSystemMenu(GetForegroundWindow(),FALSE);

    DeleteMenu(MenuH,SC_CLOSE,MF_BYCOMMAND);
}

#pragma ENDDUMP
Agradeço a ajuda e a paciência de todos.

programa em xHarbour chamado via Agendador de Tarefas

Enviado: 27 Out 2011 02:15
por cjp
Meu caro,

Baixei a WAPI e li toda a documentação. Entendi a função SETBUTTONX, que é bem simples.

Só não estou conseguindo chamá-la no meu programa. Não sei se estou fazendo alguma besteira, mas fiz assim: compilei com xbuild acrescendo a wapi.lib. Daí tentei chamá-la no meu programa, mas dá erro na linha em que chamo. Tentei chamá-la de várias formas, mas nenhuma funcionou.

Será que fiz algo errado?

programa em xHarbour chamado via Agendador de Tarefas

Enviado: 27 Out 2011 14:48
por Pablo César
Peço que entenda que não estou querendo ganhr tudo pronto, nem estou sendo preguiçoso. Apenas sou iniciante nessa área, não sou profissional, e estou fazendo um esforço enorme pra aprender
Fico contente saber que você está tentado pôr em prática nossa indicações e valorizo a pessoa que se supera. Fico grato porque além de poder ajudá-lo você mesmo está nos ajudando também. Essas rotinas em C do Manuel Mercado podem ser muito útéis para todos nós e eu agradeço. Você baixou o WAPI e fico entusiasmado de saber que entendeu a sua funcionalidade. Agora vou dar-lhe um boa dica de como desabilitar o "x" da janela de sessão do seu aplicativo, de forma externa.

A idéia é que o agendador de tarefas ao invés de chamar o executável ele passe a chamar o arquivo batch que contém o WAPI e o seu aplicativo. Para facilitar vou dar o nome de programa.exe ao seu programa, lá vamos então:

1. Você terá que criar um arquivo .BAT (vamo dar o nome de AGENDOU.BAT), onde você irá chamar o WAPI e obter o numero do handle da sessão e gravar no arquivo MYHAND.TXT. Desta forma:
WAPI -GETMYHANDLE:MYHAND.TXT
2. Você precisará criar um aplicativo (daremos o nome de TIRA_X.exe) que leia o arquivo MYHAND.TXT que foi criado e obter o número que contém dentro e assim chamar o WAPI.EXE com o parâmetro que precisa para desabilitar o "x". Desta forma:
WAPI -SETBUTTONX:off;o_numero_do_handle_obtido
3. Após desabilitar o "x" de dentro do aplicativo TIRA_X.exe, você precisa chamar o seu PROGRAMA.EXE. Portanto o arquivo AGENDOU.BAT deve ter o seguinte conteúdo:

Código: Selecionar todos

@ECHO OFF
WAPI.EXE -GETMYHANDLE:MYHAND.TXT
TIRA_X.EXE
PROGRAMA.EXE
E será este o arquivo você colocará no agendador de tarefas, o AGENDOU.BAT.
Se ainda houver dúvidas de como fazer o TIRA_X, poste a sua tentativa em código fonte e darei instrução mais específica, se precisar.
Pelo que eu entendi da leitura do fórum recomendada, bastaria usar include <hwgui.ch>, mas aqui não funcionou.
Não é somente isso... leia o arquivo .doc
Instalei a versão da HMG que baixei neste fórum, mas não consegui ainda usá-la.
Qual foi a versão que você instalou agora para o seu começo ? É uma pena que você não esteja com muito tempo para dedicar ao HMG. Senão você iria aproveitar com maior facilidade o mundo do Harbour, seja em modo console ou em gráfico.
Não sei compilar com ela
Você deveria baixar e ler este documento doc que traduzí neste tópico: https://pctoledo.org/forum/viewto ... 543#p66474 mas lembre instale o Hmg.3.0.35 assim você terá melhor opção de compilação em modo console para o seu início. Dessa forma você conseguirá com maior facilidade converter suas aplicações em Clipper para 32 bits em Harbour.

Depois de você ter conseguido dominar o Harbour em modo console, sugiro que estude o HMG para o modo gráfico. Comece fazendo exemplo simples como estes: https://sites.google.com/site/vivaclipper2/tutorial que são bem explicativos. Também veja os outros links recomendados no final do doc.

programa em xHarbour chamado via Agendador de Tarefas

Enviado: 28 Out 2011 03:06
por cjp
Meu caro, fiz o que disse, mas está dando o seguinte erro:


txwapi.prg(9) Error E0030 Syntax error: "syntax error at '-'"

A linha 9, onde está dando erro, está assim:

wapi -setbuttonx:off;nrhand

Sendo que nrhand é o número passado pelo wapi para o arquivo myhand.txt, como vc mandou fazer.

Será que eu fiz alguma coisa errada?

No mais, agradeço muito tua ajuda. Vou sim estudar a HMG; tenho certeza que me será muito útil. A versão dela que eu baixei neste fórum, creio que não seja a que vc recomendou. Tem algum lugar indicado para baixar essa versão que vc recomendou?

Inacio

programa em xHarbour chamado via Agendador de Tarefas

Enviado: 28 Out 2011 08:49
por Pablo César
fiz o que disse, mas está dando o seguinte erro:
txwapi.prg(9) Error E0030 Syntax error: "syntax error at '-'"
Inacio, sempre é de boa prática você mostrar o seu código fonte ou parte dele, pois a maioria das vezes é necessário analisar o código completo para poder entender.
A linha 9, onde está dando erro, está assim:
wapi -setbuttonx:off;nrhand
Bem aqui tem dois erros graves.

1. Você tem que executar o WAPI de dentro da sua aplicação Clipper, pois é um aplicativo externo (isso eu ja disse) portanto para poder executá-lo sempre será acompanhado com o comando RUN (você ainda não me respondeu se utiliza RTLINK ou BLINKER...) pois se utilizar BLINKER pode utilizar o SWPRUNCMD que é melhor que o RUN. Mas nesta situação o RUN ja bastaria.

2. A variável nrhand, como você mesmo disse, é numérica. Quando você concatena (ação de juntar strings) e strings são caracteres. Portanto você irá precisar converter a variável numérica para caracter. Mas não entendo por quê essa variável é numérica (por isso requer o seu código, não tenha vergonha, pode mostrar) pois quando você leu o arquivo MYHAND.TXT ela devia ser do tipo caracter e a variável deveria ser chamada de cHand (para manter o padrão).
Vou sim estudar a HMG; tenho certeza que me será muito útil.
Como eu disse, vai ser útil tanto para você fazer programas do tipo em DOS (modo console) como também programas do tipo Windows (do tipo GUI) e com maior facilidades que as outras ferramentas oferecem (isso é a minha opinião pessoal).
A versão dela que eu baixei neste fórum, creio que não seja a que vc recomendou.
Creio ? Bem é só olhar o nome da pasta onde foi instalado, se você não mudou o nome original, deve ser algo como: Hmg.3.0.35, Hmg.3.0.36, Hmg.3.0.37, Hmg.3.0.38 ou Hmg.3.0.39. Utilizando o Windows Explorer ou dando um DIR na linha de comando irá saber...
Tem algum lugar indicado para baixar essa versão que vc recomendou?
Eu ja disse, leia o arquivo .doc

programa em xHarbour chamado via Agendador de Tarefas

Enviado: 28 Out 2011 15:35
por cjp
Realmente comi bola. Esqueci que era programa externo que tinha que ser chamado com o Run. E achei que era pra ser uma variável numérica.

Fiz os dois acertos e funcionou perfeitamente. Muitíssimo obrigado.

Só pra não te deixar sem resposta: eu compilo com o xbuild do xharbour, não é com rtlink nem com o blinker.

Vou estudar o doc da hmg.

Muito obrigado por toda a ajuda e paciência. Se algum dia eu puder ser útil de alguma forma, estou à disposição.