Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ КПК ΠΈ смартфонов Π½Π° .NET Compact FrameworkΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 22

Автор АлСксандр Климов

β–‘ Π£Π±ΠΈΡ‚ΡŒ β€” Π·Π°ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ процСсс;

β–‘ Πž ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ β€” Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎΠ± Π°Π²Ρ‚ΠΎΡ€Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹;

β–‘ Π“ΠΎΡ‚ΠΎΠ²ΠΎ β€” Π·Π°ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ. Π’Π½Π΅ΡˆΠ½ΠΈΠΉ Π²ΠΈΠ΄ этого мСню ΠΏΠΎΠΊΠ°Π·Π°Π½ Π½Π° рис. 7.6.

Рис. 7.6. ΠšΠΎΠΌΠ°Π½Π΄Ρ‹ мСню для ΠΏΡ€Π°Π²ΠΎΠΉ ΠΊΠ½ΠΎΠΏΠΊΠΈ

Код ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹

ΠŸΡ€ΠΈ Π°ΠΊΡ‚ΠΈΠ²Π°Ρ†ΠΈΠΈ основной Ρ„ΠΎΡ€ΠΌΡ‹ MainForm ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ список Π·Π°ΠΏΡƒΡ‰Π΅Π½Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ fillTaskList, ΠΊΠΎΠ΄ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ Π² листингС 7.24.

Листинг 7.24

private void fillTaskList() {

 Cursor.Current = Cursors.WaitCursor;

 // ΠŸΠΎΠ»ΡƒΡ‡ΠΈΠΌ список Π·Π°ΠΏΡƒΡ‰Π΅Π½Π½Ρ‹Ρ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ

 windows = WindowHelper.EnumerateTopWindows();

 // ЗаполняСм ListView

 ListViewItem lvi;

 listView.BeginUpdate();

 listView.Items.Clear();

 foreach(Window w in windows) {

  lvi = new ListViewItem(w.ToString());

  listView.Items.Add(lvi);

 }

 listView.EndUpdate();

 if (listView.Items.Count > 0) {

  listView.Items[0].Selected = true;

  listView.Items[0].Focused = true;

 }

 Cursor.Current = Cursors.Default;

}

Данная ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ класс WindowHelper, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ позволяСт ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ Π·Π°ΠΏΡƒΡ‰Π΅Π½Π½Ρ‹Ρ… прилоТСниях. Π’ листингС 7.25 ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ ΠΊΠΎΠ΄ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° EnumerateTopWindows, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ всС ΠΎΠΊΠ½Π° Π·Π°ΠΏΡƒΡ‰Π΅Π½Π½Ρ‹Ρ… Π² систСмС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ.

Листинг 7.25

public static Window[] EnumerateTopWindows() {

 ArrayList windowList = new ArrayList();

 IntPtr hWnd = IntPtr.Zero;

 Window window = null;

 // ΠŸΠΎΠ»ΡƒΡ‡ΠΈΠΌ ΠΏΠ΅Ρ€Π²ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ

 hWnd = GetActiveWindow();

 hWnd = GetWindow(hWnd, GW_HWNDFIRST);

 while(hWnd != IntPtr.Zero) {

  if (IsWindow(hWnd) && IsWindowVisible(hWnd)) {

   IntPtr parentWin = GetParent(hWnd);

   if ((parentWin == IntPtr.Zero)) {

    int length = GetWindowTextLength(hWnd);

    if (length > 0) {

     string s = new string('\0', length + 1);

     GetWindowText(hWnd, s.length + 1);

     s = s.Substring(0, s.IndexOf('\0'));

     if (s != "Tray" && s != "Start" && s != "Task Manager") {

      window = new Window();

      window.Handle = hWnd;

      window.Text = s;

      windowList.Add(window);

     }

    }

   }

  }

  hWnd = GetWindow(hWnd, GW_HWNDNEXT);

 }

 return (Window[])windowList.ToArray(typeof(Window));

}

Π’ этом ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Windows API, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ список всСх ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹Ρ… ΠΎΠΊΠΎΠ½. ВсС ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½Π½Ρ‹Π΅ ΠΎΠΊΠ½Π° Π΄ΠΎΠ±Π°Π²Π»ΡΡŽΡ‚ΡΡ Π² список, Ссли ΠΎΠ½ΠΈ ΡƒΠ΄ΠΎΠ²Π»Π΅Ρ‚Π²ΠΎΡ€ΡΡŽΡ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ условиям. ДобавляСмыС ΠΎΠΊΠ½Π° Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΡ… ΠΎΠΊΠΎΠ½, ΠΎΠ½ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ Π²ΠΈΠ΄ΠΈΠΌΡ‹ΠΌΠΈ ΠΈ ΠΈΠΌΠ΅Ρ‚ΡŒ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ. ΠŸΡ€ΠΈ этом сам ДиспСтчСр Π·Π°Π΄Π°Ρ‡ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠΎΠΏΠ°ΡΡ‚ΡŒ Π² этот список. ВсС ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΎΠΊΠ½Π° Π·Π°ΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ΡΡ Π² массив.

Активация ΠΈ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ прилоТСния

Для Π°ΠΊΡ‚ΠΈΠ²Π°Ρ†ΠΈΠΈ Π·Π°ΠΏΡƒΡ‰Π΅Π½Π½ΠΎΠ³ΠΎ прилоТСния вызываСтся функция Windows API SetForegroundWindow, которая ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ дСскриптор ΠΎΠΊΠ½Π°. Для закрытия прилоТСния ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ функция SendMessage с ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ сообщСниСм закрытия WM_CLOSE. Для закрытия сразу всСх ΠΎΠΊΠΎΠ½ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Windows API SHCloseApps, которая Π·Π°ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ всС Π·Π°ΠΏΡƒΡ‰Π΅Π½Π½Ρ‹Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΊΡ€ΠΎΠΌΠ΅ самого ДиспСтчСра Π·Π°Π΄Π°Ρ‡. Код, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰ΠΈΠΉ эти дСйствия, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ Π² листингС 7.26.

Листинг 7.26

public static void ActivateWindow(IntPtr hWnd) {

 // АктивируСм ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅

 SetForegroundWindow(hWnd);

}


public static void CloseWindow(IntPtr hWnd) {

 // Π—Π°ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅

 SendMessage(hWnd, WM_CLOSE, 0, 0);

}


public static void CloseApps() {

 // Π—Π°ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ всС прилоТСния

 SHCloseApps(int.MaxValue);

}

ΠŸΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»Π΅Π½ΠΈΠ΅ процСссов

Для отобраТСния списка процСссов ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ функция, ΠΊΠΎΠ΄ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ Π² листингС 7.27.

Листинг 7.27

private void fillProcessList() {

 Cursor.Current = Cursors.WaitCursor;

 // ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ список Π·Π°ΠΏΡƒΡ‰Π΅Π½Π½Ρ‹Ρ… процСссов

 processes = Process.GetProcesses();

 // ЗаполняСм ListView

 ListViewItem lvi;

 listView.BeginUpdate();

 listView.Items.Clear();

 foreach (Process p in processes) {

  lvi = new ListViewItem(p.ProcessName);

  //lvi.SubItems.Add("ID");

  listView.Items.Add(lvi);

 }

 listView.EndUpdate();

 if (listView.Items.Count > 0) {

  listView.Items[0].Selected = true;

  listView.Items[0].Focused = true;

 }

 Cursor.Current = Cursors.Default;

}

Бписок Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹Ρ… процСссов извлСкаСтся ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ класса Process. Основой класса являСтся ΠΌΠ΅Ρ‚ΠΎΠ΄ GetProcesses, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ Π² листингС 7.28.

Листинг 7.28

public static Process[] GetProcesses() {

 ArrayList procList = new ArrayList();

 IntPtr handle = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

 if ((int)handle > 0) {

  try {

   PROCESSENTRY32 peCurrent;

   PROCESSENTRY32 pe32 = new PROCESSENTRY32();

   byte[] peBytes = pe32.ToByteArray();

   int retval = Process32First(handle, peBytes);

   while(retval == 1) {

    peCurrent = new PROCESSENTRY32(peBytes);

    Process proc =

     new Process(new IntPtr((int)peCurrent.PID), peCurrent.Name,

     (int)peCurrent.ThreadCount, (int)peCurrent.BaseAddress);

     procList.Add(proc);

    retval = Process32Next(handle, peBytes);

   }

  } catch(Exception ex) {

   throw new Exception("Exception: " + ex.Message);

  }

  CloseToolhelp32Snapshot(handle);

  return (Process[])procList.ToArray(typeof(Process));

 } else {

  throw new Exception("Unable to get processes!");

 }

}

Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ·Π½Π°Ρ‚ΡŒ Π΄Π΅Ρ‚Π°Π»ΡŒΠ½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ процСссС.

Π—Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ процСсса

Π§Ρ‚ΠΎΠ±Ρ‹ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΡŒ процСсс, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΌΠ΅Ρ‚ΠΎΠ΄ Kill, ΠΊΠΎΠ΄ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ Π² листингС 7.29.

Листинг 7.29

public void Kill() {

 IntPtr hProcess;

 hProcess = OpenProcess(PROCESS_TERMINATE, false, (int) processId);

 if (hProcess != (IntPtr) INVALID_HANDLE_VALUE) {

  bool bRet;

  bRet = TerminateProcess(hProcess, 0);

  CloseHandle(hProcess);

 }

}

Π”Π°Π½Π½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π²Ρ‹Π·ΠΎΠ²Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Windows API. Ѐункция OpenProcess ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ дСскриптор процСсса, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π·Π°Ρ‚Π΅ΠΌ пСрСдаСтся Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ TerminateProcess для уничтоТСния процСсса.

Код, ΠΎΡ‚Π²Π΅Ρ‡Π°ΡŽΡ‰ΠΈΠΉ Π·Π° внСшний Π²ΠΈΠ΄ элСмСнта управлСния ListView, ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π΅Π½ ΠΊΠΎΠ΄Ρƒ ΠΈΠ· ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°, поэтому Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ просто ΡΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ Π½Π΅ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ. Π’Π΅ΠΏΠ΅Ρ€ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ДиспСтчСра Π·Π°Π΄Π°Ρ‡ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ смоТСт ΡƒΠ·Π½Π°Ρ‚ΡŒ список Π·Π°ΠΏΡƒΡ‰Π΅Π½Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ ΠΈ процСссов ΠΈ Π΄Π°ΠΆΠ΅ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ ΠΈΠΌΠΈ.

МалСнький Π±Π»ΠΎΠΊΠ½ΠΎΡ‚

ΠžΠ΄Π½Π°ΠΆΠ΄Ρ‹ ΠΌΠΎΠΉ Π΄Ρ€ΡƒΠ³, Π΄Π°Π»Π΅ΠΊΠΈΠΉ ΠΎΡ‚ программирования, попросил мСня Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΏΡ€ΠΎΡΡ‚Π΅Π½ΡŒΠΊΠΈΠΉ тСкстовый Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€ для ΠΊΠ°Ρ€ΠΌΠ°Π½Π½ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π°. Π•Π³ΠΎ Π½Π΅ совсСм устраивало ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Word Mobile, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с тСкстовыми Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ Π² ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмС Windows Mobile. Π—Π°ΠΊΠ°Π·Ρ‡ΠΈΠΊ Ρ…ΠΎΡ‚Π΅Π» ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ основныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ стандартного Π‘Π»ΠΎΠΊΠ½ΠΎΡ‚Π° ΠΈΠ· Windows XP, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅, Π²Ρ‹Ρ€Π΅Π·Π°Π½ΠΈΠ΅, вставку ΠΈ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ тСкста. Π’Π°ΠΊΠΆΠ΅ ΠΎΠ½ Ρ…ΠΎΡ‚Π΅Π» ΠΎΠ±ΠΎΠΉΡ‚ΠΈΡΡŒ Π±Π΅Π· установки .NET Compact Framework 2.0, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠ°Ρ модСль Π΅Π³ΠΎ ΠΊΠ°Ρ€ΠΌΠ°Π½Π½ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π° ΠΎΠ±Π»Π°Π΄Π°Π»Π° ΠΌΠ°Π»ΠΎΠΉ Π΅ΠΌΠΊΠΎΡΡ‚ΡŒΡŽ памяти.

Π’ Ρ€Π°ΠΌΠΊΠ°Ρ… Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ поставлСнной Π·Π°Π΄Π°Ρ‡ΠΈ ΠΈ Π±Ρ‹Π»Π° написана ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π‘Π»ΠΎΠΊΠ½ΠΎΡ‚ΠΈΠΊ, которая ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒΡΡ Π² этом Ρ€Π°Π·Π΄Π΅Π»Π΅ Π³Π»Π°Π²Ρ‹.

ЕдинствСнная ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΈ написании Π΄Π°Π½Π½ΠΎΠ³ΠΎ тСкстового Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π° состояла Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° .NET Compact Framework 1.0 Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ с Π±ΡƒΡ„Π΅Ρ€ΠΎΠΌ ΠΎΠ±ΠΌΠ΅Π½Π° Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ управляСмого ΠΊΠΎΠ΄Π°. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ ΠΏΡ€ΠΈΠ±Π΅Π³Π°Ρ‚ΡŒ ΠΊ Π²Ρ‹Π·ΠΎΠ²Π°ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Windows API.

Π”Π°Π½Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² качСствС основы для Ρ‚Π΅Ρ…, ΠΊΡ‚ΠΎ Ρ…ΠΎΡ‡Π΅Ρ‚ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ свой тСкстовый Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€ для .NET Compact Framework 1.0. Надо Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Ссли Π±Ρ‹ я стал ΠΏΠΈΡΠ°Ρ‚ΡŒ свой ΠΏΡ€ΠΈΠΌΠ΅Ρ€ с использованиСм .NET Compact Framework 2.0, Ρ‚ΠΎ ΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒΡΡ с Π·Π°Π΄Π°Ρ‡Π΅ΠΉ Π±Ρ‹Π»ΠΎ Π±Ρ‹ Π³ΠΎΡ€Π°Π·Π΄ΠΎ Π»Π΅Π³Ρ‡Π΅, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ вторая вСрсия Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Π±ΡƒΡ„Π΅Ρ€ ΠΎΠ±ΠΌΠ΅Π½Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ‚Π°ΠΊ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌ ΠΏΡ€ΠΈ опСрациях с тСкстом.

ΠŸΠ΅Ρ€Π²Ρ‹Π΅ шаги

ПослС запуска Visual Studio .NET 2005 Π½Π°Π΄ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚. ΠŸΡ€ΠΈ Π²Ρ‹Π±ΠΎΡ€Π΅ Ρ‚ΠΈΠΏΠ° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π½Π°Π΄ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ .NET Compact Framework 1.0. Для Π½Π°Ρ‡Π°Π»Π° Π½Π° Ρ„ΠΎΡ€ΠΌΠ΅ слСдуСт Ρ€Π°Π·ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ тСкстовоС ΠΏΠΎΠ»Π΅ с ΠΈΠΌΠ΅Π½Π΅ΠΌ txtEditor. Для свойства Multiline Π½Π°Π΄ΠΎ Π·Π°Π΄Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ True, Π° свойство ScrollBars ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Both.

Π’Π°ΠΊ ΠΊΠ°ΠΊ тСкстовоС ΠΏΠΎΠ»Π΅ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ всС пространство Ρ„ΠΎΡ€ΠΌΡ‹, Π΅Π³ΠΎ Π½ΡƒΠΆΠ½ΠΎ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ Ρ€Π°ΡΡ‚ΡΠ½ΡƒΡ‚ΡŒ Π΄ΠΎ Π½ΡƒΠΆΠ½ΠΎΠ³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Π°. Учитывая, Ρ‡Ρ‚ΠΎ я писал ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ для ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ мобильного устройства, большой ошибки Π² ΠΌΠΎΠΈΡ… дСйствиях Π½Π΅ Π±Ρ‹Π»ΠΎ. Но Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ Π·Π°Π±Ρ‹Π²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ устройства, Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹ экрана Ρƒ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π±ΡƒΠ΄ΡƒΡ‚ Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ стоит ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹ элСмСнтов ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎ Π² соотвСтствии с Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΌΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€Π°ΠΌΠΈ Ρ„ΠΎΡ€ΠΌΡ‹.

Π’Π°ΠΊΠΆΠ΅ Π½Π° ΠΏΠ΅Ρ€Π²ΠΎΠΌ этапС Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π½Π°Π΄ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ тСкстового поля ΠΈ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π² Π½Π΅ΠΌ фокус. Π‘ΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄ Π±Ρ‹Π» Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ Π² ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ события Form_Load, Ρ‡Ρ‚ΠΎ ΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ листинг 7.30.