Сообщения windows api все еще существуют? - PullRequest
0 голосов
/ 14 июля 2020

Долгое время go (в далекой галактике), я использовал некоторые забавные инструменты, чтобы помочь мне (как инвалиду) или просто поддержать мою лень :) Инструменты, которые делают такие вещи, как «подождите 30 секунд» а затем нажмите «Воспроизвести на моем медиаплеере» или «сохранить список всех названий песен из Winamp, транслирующих прямую трансляцию радио на основе m3u». это было почти 20 лет после go, с использованием C# и оконных сообщений api (не желая ретранслировать щелчки мыши и строгий размер и положение окна). Я бы нашел дескриптор окна и дескриптор «элемента управления» и взаимодействовал бы с ним.

Вопрос в том, могу ли я все еще делать это сегодня, в возрасте Windows 10? Если да, то как? Я был бы признателен за отправную точку.

Допустим, я хочу нажать кнопку воспроизведения на моем bs.player через x секунд или закрыть сообщение об ошибке, которое появляется каждые 10 секунд (ну, это не причина 'my windows здорова .. но теоретически).

Спасибо :)

1 Ответ

1 голос
/ 14 июля 2020

Да, можно, если вы говорите о Windows API.

Вам нужно объявить внешние подписи WinAPI как static extern, используя атрибут DllImport .

Например, чтобы узнать, активна ли экранная заставка или приложение работает в полноэкранном режиме:

private const int WM_SYSCOMMAND = 0x0112;
private const int SC_SCREENSAVE = 0xF140;
private const int SPI_GETSCREENSAVERRUNNING = 0x0072;

[DllImport("user32.dll", SetLastError = true)]
static extern bool SystemParametersInfo(int action, int param, ref int retval, int updini);

[StructLayout(LayoutKind.Sequential)]
private struct RECT
{
  public int left;
  public int top;
  public int right;
  public int bottom;
}

[DllImport("user32.dll")]
static private extern bool GetWindowRect(HandleRef hWnd, [In, Out] ref RECT rect);

[DllImport("user32.dll")]
static private extern IntPtr GetForegroundWindow();

static private bool IsForegroundFullScreen()
{
  return IsForegroundFullScreen(null);
}

static private bool IsForegroundFullScreen(Screen screen)
{
  if ( screen == null ) screen = Screen.PrimaryScreen;
  RECT rect = new RECT();
  GetWindowRect(new HandleRef(null, GetForegroundWindow()), ref rect);
  return new Rectangle(rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top)
             .Contains(screen.Bounds);
}

private bool IsScreensaverActive()
{
  int active = 1;
  SystemParametersInfo(SPI_GETSCREENSAVERRUNNING, 0, ref active, 0);
  return active != 0;
}

private bool IsForegroundFullScreenOrScreensaver()
{
  return IsForegroundFullScreen() || IsScreensaverActive();
}

Вызов DLL Win32 в C#

c# dllimport с указателями

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...