Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.87/23: Рейтинг темы: голосов - 23, средняя оценка - 4.87
19 / 19 / 0
Регистрация: 04.03.2009
Сообщений: 56
1

Надо запустить процесс notepad средствами WinAPI

10.04.2009, 15:57. Показов 4661. Ответов 6
Метки нет (Все метки)

Надо запустить процесс notepad средствами WinAPI. Надо, чтобы просто передо мной открылось окно notepad. Но функция CreateProcess возвращает false, и notepad не запускается. Что я делаю не так?

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
public class ProcessInfo
{
public IntPtr hProcess;
public IntPtr hThread;
public Int32 ProcessId;
public Int32 ThreadId;
}
public class SECURITY_ATTRIBUTES 
{
public Int32 nLength;
public Int32 lpSecurityDescriptor;
public bool bInheritHandle;
}
[DllImport("kernel32.dll", SetLastError = true)]
private static extern bool CreateProcess
(
string imageName,
string cmdLine,
SECURITY_ATTRIBUTES lpProcessAttributes,
SECURITY_ATTRIBUTES lpThreadAttributes,
bool boolInheritHandles,
Int32 dwCreationFlags,
Int32 lpEnvironment,
string lpszCurrentDir,
byte[] si,
ProcessInfo pi
); 
private void button5_Click(object sender, EventArgs e)
{
ProcessInfo ProcInf = null;
byte[] startUpInfo = new byte[18];
startUpInfo[0] = 18 * sizeof(byte);
///////////////////
startUpInfo[1] = 0;
startUpInfo[2] = 0;
startUpInfo[3] = 0;
///////////////////
startUpInfo[4] = 0;
startUpInfo[5] = 0;
startUpInfo[6] = 0;
startUpInfo[7] = 0;
startUpInfo[8] = 0;
startUpInfo[9] = 0;
startUpInfo[10] = 0;
startUpInfo[11] = 1;
startUpInfo[12] = 0;
startUpInfo[13] = 0;
///////////////////////////////
startUpInfo[14] = 0;
///////////////////////////////
startUpInfo[15] = 0;
startUpInfo[16] = 0;
startUpInfo[17] = 0;
SECURITY_ATTRIBUTES ProcessAttr = null;
SECURITY_ATTRIBUTES ThreadAttr = null;
bool b = CreateProcess("D:\\notepad.exe", null, ProcessAttr, ThreadAttr, false, 32, 0, "D:\\", startUpInfo, ProcInf);
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.04.2009, 15:57
Ответы с готовыми решениями:

Как быстрее запустить процесс - используя класс Process или через WinAPI
Какой вариант будет быстрее и меньше есть ресурсов компа? Process.Start("myexe.exe", "lol"); ...

Нужно запустить notepad как процесс в "свернутом виде"
Вот есть код,который запускает notepad(пример с учебника): #include <windows.h> TCHAR...

SendInput и Notepad (WinAPI)
Добрый день всем, вот уже неделю бьюсь над разбором программы, которая бы отправляла нажатия кнопок...

Создать дочерний процесс notepad
Доброго дня) Нуждаюсь в Вашей помощи:help:, дорогие форумчане. =) Давно не писал на делфи, не...

6
98 / 54 / 3
Регистрация: 18.03.2009
Сообщений: 273
10.04.2009, 16:04 2
Попробуй функцию ShellExecute. -> http://msdn.microsoft.com/en-u... S.85).aspx
0
0 / 0 / 0
Регистрация: 01.04.2009
Сообщений: 24
10.04.2009, 18:16 3
c++ запускает так:
C++
1
2
3
4
5
6
7
8
9
STARTUPINFO         si;
PROCESS_INFORMATION pi;
ZeroMemory( &si, sizeof(STARTUPINFO) );
ZeroMemory( &pi, sizeof(PROCESS_INFORMATION));
si.cb          = sizeof( STARTUPINFO );
si.dwFlags     = STARTF_USESHOWWINDOW;
si.wShowWindow = SW_MAXIMIZE ;
CreateProcess( NULL,"NOTEPAD",NULL, NULL, FALSE,0, 
             NULL, NULL, &si, &pi);
переделай под себя
0
2826 / 1635 / 252
Регистрация: 03.12.2007
Сообщений: 4,222
10.04.2009, 21:17 4
Может быть, в качестве ProcInf нельзя ноль передавать - туда же должны сохраняться хэндлы, которые закрывать надо?
0
0 / 0 / 0
Регистрация: 01.04.2009
Сообщений: 24
10.04.2009, 21:30 5
Там надо просто вместо "D:\\notepad.exe" поставить null, а вместо следующего null "notepad.exe"
0
2826 / 1635 / 252
Регистрация: 03.12.2007
Сообщений: 4,222
11.04.2009, 00:13 6
Цитата Сообщение от vlakurs Посмотреть сообщение
Там надо просто вместо "D:\\notepad.exe" поставить null, а вместо следующего null "notepad.exe"
И что, после исправления только этого работает? Вообще вариант, когда первый параметр - полный путь, командная строка пустая, возможен вроде.
0
19 / 19 / 0
Регистрация: 04.03.2009
Сообщений: 56
11.04.2009, 00:29  [ТС] 7
Всё, разобрался. Вот вроде бы работающий вариант:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
        [DllImport("kernel32.dll", SetLastError = true)]
        private static extern bool CreateProcess
        (
          String imageName,
          String cmdLine,
          ref SECURITY_ATTRIBUTES lpProcessAttributes,
          ref SECURITY_ATTRIBUTES lpThreadAttributes,
          bool boolInheritHandles,
          uint dwCreationFlags,
          IntPtr lpEnvironment,
          string lpszCurrentDir,
          ref STARTUPINFO si,
          out PROCESS_INFORMATION pi
         );
        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
        struct STARTUPINFO
        {
            public Int32 cb;
            public string lpReserved;
            public string lpDesktop;
            public string lpTitle;
            public Int32 dwX;
            public Int32 dwY;
            public Int32 dwXSize;
            public Int32 dwYSize;
            public Int32 dwXCountChars;
            public Int32 dwYCountChars;
            public Int32 dwFillAttribute;
            public Int32 dwFlags;
            public Int16 wShowWindow;
            public Int16 cbReserved2;
            public IntPtr lpReserved2;
            public IntPtr hStdInput;
            public IntPtr hStdOutput;
            public IntPtr hStdError;
        }
        [StructLayout(LayoutKind.Sequential)]
        internal struct PROCESS_INFORMATION
        {
            public IntPtr hProcess;
            public IntPtr hThread;
            public int dwProcessId;
            public int dwThreadId;
        }
 
        [StructLayout(LayoutKind.Sequential)]
        public struct SECURITY_ATTRIBUTES
        {
            public int nLength;
            public IntPtr lpSecurityDescriptor;
            public int bInheritHandle;
        }
        [Flags]
        enum MyFlags : uint
        {
            CREATE_DEFAULT_ERROR_MODE = 0x00000020,
        }
 
        [Flags]
        public enum STARTF : uint
        {
            STARTF_USESHOWWINDOW = 0x00000001,
            STARTF_USESIZE = 0x00000002,
            STARTF_USEPOSITION = 0x00000004,
            STARTF_USECOUNTCHARS = 0x00000008,
            STARTF_USEFILLATTRIBUTE = 0x00000010,
            STARTF_RUNFULLSCREEN = 0x00000020,  // ignored for non-x86 platforms
            STARTF_FORCEONFEEDBACK = 0x00000040,
            STARTF_FORCEOFFFEEDBACK = 0x00000080,
            STARTF_USESTDHANDLES = 0x00000100,
        }
        public enum SHOWWINDOW : uint
        {
            SW_HIDE = 0,
            SW_SHOWNORMAL = 1,
            SW_NORMAL = 1,
            SW_SHOWMINIMIZED = 2,
            SW_SHOWMAXIMIZED = 3,
            SW_MAXIMIZE = 3,
            SW_SHOWNOACTIVATE = 4,
            SW_SHOW = 5,
            SW_MINIMIZE = 6,
            SW_SHOWMINNOACTIVE = 7,
            SW_SHOWNA = 8,
            SW_RESTORE = 9,
            SW_SHOWDEFAULT = 10,
            SW_FORCEMINIMIZE = 11,
            SW_MAX = 11,
        }
        [DllImport("kernel32.dll", SetLastError = true)]
        static extern bool CloseHandle(IntPtr hHandle);
 
        protected override void OnStop()
        {
            STARTUPINFO si = new STARTUPINFO();
            PROCESS_INFORMATION pi = new PROCESS_INFORMATION();
            SECURITY_ATTRIBUTES ProcessAttributes = new SECURITY_ATTRIBUTES();
            SECURITY_ATTRIBUTES ThreadAttributes = new SECURITY_ATTRIBUTES();
            si.cb = Marshal.SizeOf(typeof(STARTUPINFO));
            si.lpReserved = null;
            si.lpDesktop = null;
            si.lpTitle = null;
            si.dwX = 0;
            si.dwY = 0;
            si.dwXSize = 0;
            si.dwYSize = 0;
            si.dwXCountChars = 0;
            si.dwYCountChars = 0;
            si.dwFillAttribute = 0;
            si.dwFlags = (int)(STARTF.STARTF_USESHOWWINDOW);
            si.wShowWindow = (int)(SHOWWINDOW.SW_SHOW);
            si.cbReserved2 = 0;
            si.lpReserved2 = IntPtr.Zero;
            si.hStdInput = IntPtr.Zero;
            si.hStdOutput = IntPtr.Zero;
            si.hStdError = IntPtr.Zero;
 
            string Cmd = "D:\\notepad.exe";
 
            bool b = CreateProcess(null, Cmd, ref ProcessAttributes, ref ThreadAttributes,
                    true, (uint)(MyFlags.CREATE_DEFAULT_ERROR_MODE), IntPtr.Zero, "D:\\1\\", ref si, out pi);
            CloseHandle(pi.hThread);
            CloseHandle(pi.hProcess);
        }
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.04.2009, 00:29

Не могу запустить под notepad
(defun task (lst1 lst2) (let ((l (length lst1))) (mapcar #'(lambda (x) (if (oddp (car x))...

После лечения Eset висит запущенный процесс notepad.exe
Поставила eset, просканировала компьютер полностью, было обнаружено несколько угроз, eset сказал,...

Запустить яндекс браузер через меню Notepad++
Всем доброго времени суток. Я пользуюсь браузером Яндекса. А в программе Notepad++ в меню...

Запустить макрос notepad++ при открытии из бат файла
здравствуйте. Подскажите, есть ли параметр, позволяющий запустить макрос для notepad++ через...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru