Код по управлению внешним процессом, исправить ошибки - C#
Формулировка задачи:
Выкладываю код по управлению внешним процессом, но есть ошибки... Может разберемся?
Код С#: Warning, bidlocodes!!!
Ошибка, после попытки развернуть щелкнув на панели, а не на кнопке...
Это наработка, если доделать уверен всем понадобится...
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Windows.Forms;
using System.IO;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
bool installed;
IntPtr hWinEventhook;
[DllImport("user32.dll")]
private static extern int SetForegroundWindow(IntPtr hWnd);
private const int SW_SHOWNORMAL = 1;
private const int SW_SHOWMAXIMIZED = 3;
private const int SW_RESTORE = 9;
[DllImport("user32.dll")]
private static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
public Form1()
{
InitializeComponent();
}
private void closeHandlerParagraf(object sender, EventArgs e)
{
label1.Text ="Закрываю Блакнот";
}
private void button1_Click(object sender, EventArgs e)
{
var processes = Process.GetProcessesByName("notepad");
System.Diagnostics.Process proc = new System.Diagnostics.Process();
proc.StartInfo.FileName = "notepad";
proc.EnableRaisingEvents = true;
proc.SynchronizingObject = this;
proc.Exited += new EventHandler(closeHandlerParagraf);
Wait();
if (processes.Any())
{
var handle = processes.First().MainWindowHandle;
ShowWindow(handle, SW_RESTORE);
SetForegroundWindow(handle);
label1.Text = "Разворачиваю Блокнот";
}
else
{
proc.Start();
label1.Text = "Запускаю Блокнот";
}
if (installed && pinvoke.User32.UnhookWinEvent(hWinEventhook))
installed = false;
else if (!installed)
{
var procs = Process.GetProcessesByName("notepad");
if (procs.Length > 0)
hWinEventhook = pinvoke.User32.SetWinEventHook(pinvoke.User32.EVENT_SYSTEM_MINIMIZESTART, pinvoke.User32.EVENT_SYSTEM_MINIMIZEEND, IntPtr.Zero, WinEventProc, procs[0].Id, 0, pinvoke.User32.WINEVENT_OUTOFCONTEXT);
if (hWinEventhook != IntPtr.Zero)
installed = true;
else { }//MessageBox.Show("Can't install winevent hook, err " +Marshal.GetLastWin32Error());
}
}
void WinEventProc(IntPtr hWinEventHook,uint dwEvent,IntPtr hWnd,int idObject,int idChild,uint dwEventThread,uint dwmsEventTime)
{
Debug.WriteLine(string.Format("Event: {0}\r\n\tHWND: 0x{1:X8}\r\n\tidObject: {2}\r\n\tidChild: {3}\r\n\tdwEventThread: 0x{4:X8}\r\n\tTime: {5}\r\n",dwEvent, hWnd,idObject,idChild, dwEventThread, dwmsEventTime));
switch (dwEvent)
{
case pinvoke.User32.EVENT_SYSTEM_MINIMIZEEND:
label1.Text = "Разворачиваю Блокнот";
break;
case pinvoke.User32.EVENT_SYSTEM_MINIMIZESTART:
label1.Text = "Сворачиваю Блокнот";
break;
}
}
private static void Wait()
{
Process myProcess = Process.GetProcessesByName("notepad").FirstOrDefault();
if (myProcess != null)
{
myProcess.EnableRaisingEvents = true;
myProcess.Exited += (sender, e) =>
{
};
}
}
}
}using System;
using System.Runtime.InteropServices;
namespace pinvoke
{
static class User32
{
const string USER32 = "user32.dll";
public const uint EVENT_SYSTEM_MINIMIZESTART = 0x16;
public const uint EVENT_SYSTEM_MINIMIZEEND = 0x17;
public const uint WINEVENT_OUTOFCONTEXT = 0x0;
public delegate void WINEVENTPROC (
IntPtr hWinEventHook,
uint dwEvent,
IntPtr hWnd,
int idObject,
int idChild,
uint dwEventThread,
uint dwmsEventTime
);
[DllImport( USER32, SetLastError = true )]
public static extern IntPtr SetWinEventHook (
[In] uint eventMin,
[In] uint eventMax,
[In] IntPtr hmodWinEventProc,
[MarshalAs( UnmanagedType.FunctionPtr )]
[In] WINEVENTPROC lpfnWinEventProc,
[In] int idProcess,
[In] int idThread,
[In] uint dwflags
);
[DllImport( USER32, SetLastError = true )]
[return: MarshalAs( UnmanagedType.Bool )]
public static extern bool UnhookWinEvent (
[In] IntPtr hWinEventHook
);
[StructLayout( LayoutKind.Sequential )]
public struct RECT
{
public int left;
public int top;
public int right;
public int bottom;
}
[StructLayout( LayoutKind.Sequential )]
public struct POINT
{
public int x;
public int y;
}
[StructLayout( LayoutKind.Sequential )]
public struct WINDOWPLACEMENT
{
public int length;
public uint flags;
public uint showCmd;
public POINT ptMinPosition;
public POINT ptMaxPosition;
public RECT rcNormalPosition;
}
[DllImport( USER32, SetLastError = true )]
[return: MarshalAs( UnmanagedType.Bool )]
public static extern bool GetWindowPlacement (
[In] IntPtr hWnd,
[In, Out] ref WINDOWPLACEMENT lpwndpl
);
}
}Прошу не пинать, а по Дзенски наставить на верный путь!
А еще попробовать сделать из этого class типа
ProcHook processNote = new ProcHook();
ProcHook processPaint = new ProcHook();
ProcHook processCalc = new ProcHook();
И как то передать имя процесса.
Лэйбл в принципе можно использовать один...
Что никому не интересно?
Решение задачи: «Код по управлению внешним процессом, исправить ошибки»
textual
Листинг программы
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Windows.Forms;
using System.IO;
process_win win_process = new process_win();
private void btnParagraph_Click(object sender, EventArgs e)
{
win_process.process_win_string("SIPClient.exe", "Телефон");
}