Форум Beholder
http://beholder.ru/bb/

Управление тюнером в с#
http://beholder.ru/bb/viewtopic.php?f=10&t=12082
Страница 1 из 1

Автор:  Dsob [ 16 мар 2011, 14:35 ]
Заголовок сообщения:  Управление тюнером в с#

Пишу программу для управления тюнером на C#
Есть такой код:
Код:
class PMes
{
    [DllImport("User32.dll")]
    public extern static int PostMessage(IntPtr hWnd, Int32 msg, Int32 wParam, Int32 lParam);
}

protected void Button1_Click(object sender, EventArgs e)
        {
      int WM_USER=1024;
      Process[] process = Process.GetProcessesByName("BeholdTV");
      IntPtr pWindow = process[0].MainWindowHandle;
      PMes.PostMessage(pWindow, WM_USER + 200, WM_USER + 291, 0);
       }

По идее при нажатии на кнопку процесс BeholdTV должен закрыться, но этого не происходит.
Пробовал давать другие команды - никакой реакции.
Кто уже создавал дополнительные приложения, подскажите пожалуйста в чем здесь ошибка ?

Автор:  hd44780 [ 16 мар 2011, 15:05 ]
Заголовок сообщения: 

Ты командное окно неправильно ищешь.
Разработчики ж давали пример:

HWND hBhWnd = FindWindow ("TMain", "BeholdTV");

Get version of Behold TV {Получить новер версии ПО} -
DWORD dwVer = (DWORD) SendMessage(hBhWnd, WM_BHCMD, WMBH_GETVERSION, NULL);
if (HIWORD(dwVer) == 4 && LOWORD(dwVer) == 58)
{ // this is version 4.58
}

Вот и пиши прямо и буквально:

..................................
[DllImport ( "user32.dll", CharSet = CharSet.Auto )]
public static extern IntPtr FindWindow ( [MarshalAs ( UnmanagedType.LPTStr )] string lpClassName,
[MarshalAs ( UnmanagedType.LPTStr )] string lpWindowName );

[DllImport ( "user32.dll", CharSet = CharSet.Auto )]
public static extern int SendMessageA ( IntPtr hWnd, int wMsg, int wParam, uint lParam );
..................................

Потом просто:

const string WIN_CLASS = "TMain";
const string APP_NAME = "BeholdTV";

IntPtr hWnd = FindWindow(WIN_CLASS, APP_NAME);
if (hWnd.Equals(IntPtr.Zero))
return false;

// получаем версию ПО:
const int WM_USER = 0x0400; // Standard, from Windows.h
const int WM_BHCMD = WM_USER + 200;
const int WMBH_GETVERSION = WM_USER + 285; // Get version of Behold TV {Получить новер версии ПО}

int version = SendMessageA ( hWnd, WM_BHCMD, WMBH_GETVERSION, NULL );

Зачем велосипед изобретать? Процессы искать ...
Процесс-то ты найдешь, а окон у него до фига - посмотри Spy++.
И почему ты решил, что слать надо главному окну? А если они завтра новую версию выпустят и главное окно поменяют?
Или еще что-нибудь сделают?

Работаю с такими конструкциями уже года 2 и никогда никаких проблем не знал.

Автор:  Dsob [ 16 мар 2011, 16:03 ]
Заголовок сообщения: 

Большое спасибо, все получилось :)

Автор:  Pavell [ 29 ноя 2013, 07:08 ]
Заголовок сообщения:  Re: Управление тюнером в с#

hd44780 или Dsob, подскажите, пожалуйста!
Пробую повторить то, что здесь описано на C#. Но в С# я не силён.
Студия сразу ругается на:
Код:
[DllImport("User32.dll")]

DllImport - Не удалось найти имя типа или пространства имён [DllImport] (пропущена директива using или ссылка на сборку).

Для наглядности привожу мой код с самого начала, чтобы было видно что у меня пропущено:
Код:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace DetectFn
{
    public partial class Form1 : Form
    {
        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        public static extern IntPtr FindWindow([MarshalAs(UnmanagedType.LPTStr)] string lpClassName, ... ...

Либо через using не объявил DllImport, либо через Проект >> Добавить ссылку надо что-то добавить. А откуда и что?

Автор:  hd44780 [ 03 дек 2013, 11:26 ]
Заголовок сообщения:  Re: Управление тюнером в с#

писал(а):
Студия сразу ругается на:
Код:
[DllImport("User32.dll")]

DllImport - Не удалось найти имя типа или пространства имён [DllImport] (пропущена директива using или ссылка на сборку).


using System.Runtime.InteropServices;

Страница 1 из 1 Часовой пояс: UTC + 3 часа