Forums.Avtograd.Ru: Вопросы по WinApi - Forums.Avtograd.Ru

Перейти к содержимому

  • (4 Страниц)
  • +
  • 1
  • 2
  • 3
  • 4
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

Вопросы по WinApi

#1 Пользователь офлайн   Exception

  • Активный пользователь
  • PipPipPip
  • Группа: Пользователи
  • Сообщений: 550
  • Регистрация: 01 Ноябрь 07

Отправлено 01 Ноябрь 2007 - 18:29

Если модератор не против, то вот примеры для Delphi для WinApi. :lol:
0


  • (4 Страниц)
  • +
  • 1
  • 2
  • 3
  • 4
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

Другие ответы в этой теме

#41 Пользователь офлайн   Роман Шувалов

  • Пользователь
  • PipPip
  • Группа: Пользователи
  • Сообщений: 197
  • Регистрация: 02 Ноябрь 07

Отправлено 28 Март 2009 - 14:50

Пишу первое (почти первое) GUI-приложение, пытаюсь описать класс, отвечающий за окно и такие же классы, отвечающие за кнопки и прочее (наподобие wxFrame в wxWidgets, TForm в борланд билдере и т.п., но, естественно, упрощенно). в нём будут методы OnSize(), OnPaint() и т.п., вызываемые при получении сообщений WM_SIZE, WM_PAINT и т.п. - короче говоря, работать я уже буду только с ним (с объектом класса) без всяких разборок с полученными сообщениями и т.п. - так, как это происходит при работе с той же wxWidgets или в борланд билдере.

столкнулся с проблемой - WindowProc() должна быть отдельной функцией, не являющейся методом описываемого класса, и как следствие она не имеет к нему никакого доступа. подскажите, как быть в данной ситуации?
Роман
0

#42 Пользователь офлайн   musashi

  • Активный пользователь
  • PipPipPip
  • Группа: Пользователи
  • Сообщений: 573
  • Регистрация: 01 Ноябрь 07

Отправлено 28 Март 2009 - 21:31

Цитата

и как следствие она не имеет к нему никакого доступа

кто "она" и куда "к нему" ?

static класс ?
0

#43 Пользователь офлайн   Роман Шувалов

  • Пользователь
  • PipPip
  • Группа: Пользователи
  • Сообщений: 197
  • Регистрация: 02 Ноябрь 07

Отправлено 28 Март 2009 - 21:39

она - функция WindowProc() - не имеет доступа к нему - экземпляру класса "Окно" - поскольку не является его членом да и вообще ни коем образом не имеет к нему отношения.

класс естественно не static, иначе никакой проблемы бы не было
Роман
0

#44 Пользователь офлайн   musashi

  • Активный пользователь
  • PipPipPip
  • Группа: Пользователи
  • Сообщений: 573
  • Регистрация: 01 Ноябрь 07

Отправлено 29 Март 2009 - 02:37

ну так ты пишешь

Цитата

...столкнулся с проблемой - WindowProc() должна быть отдельной функцией, не являющейся методом описываемого класса...


а я тебе в ответ

Цитата

static метод/класс за пределами создаваемого класса ? //подредактировал, чтобы понятней было

это был намек на решение
0

#45 Пользователь офлайн   Роман Шувалов

  • Пользователь
  • PipPip
  • Группа: Пользователи
  • Сообщений: 197
  • Регистрация: 02 Ноябрь 07

Отправлено 29 Март 2009 - 02:40

статиком будет решение только, если экземпляр класса будет один. а у меня... может кстати один и будет :)

а вот что мне написали в ответах Google:

Цитата

Вариантов очень много.
Например сделать общую оконную процедуру которая будет вызывать метод твоего класса определяя экземпляр по handle окна.
В CreateWindow передай указатель на твой класс через свойство lpParam.
В общем обработчике WindowProc на событии WM_CREATE лови переданный lpParam и вызывай для него обрабочик создания.
А для других сообщений(после WM_CREATE), имея хэндл возвращенный из CreateWindow, ты можешь привязать к нему указатель на класс с помощью SetWindowLong ( hwnd, GWL_USERDATA, (LONG)указатель на класс) и доставать его с помощью GetWindowLong().


решение вроде тоже очень даже неплохое.
Роман
0

#46 Пользователь офлайн   up

  • Старожил
  • PipPipPipPipPip
  • Группа: Пользователи
  • Сообщений: 1 193
  • Регистрация: 01 Ноябрь 07

Отправлено 29 Март 2009 - 15:48

создать список окон. список компонетнов в окне. окно создаётся, и добалвяет туда себя. компонет создаётся, и добавляет себя в список компонетнов в окне. а WindowProc обходит эти списки и раскидывает параметры.

upd. хотя WM_CREATE: SetWindowLong ( hwnd, GWL_USERDATA, (LONG)Self); ещё проще =)
0

#47 Пользователь офлайн   Saray

  • Старожил
  • PipPipPipPipPip
  • Группа: Пользователи
  • Сообщений: 2 388
  • Регистрация: 31 Январь 08

Отправлено 11 Август 2009 - 08:14

Господа, вот такой вопрос:
есть чужое приложение, написанное под джаву.
Надо из нестандартного компонента, напоминающего Memo, как то вытащить текст.
Главное окно имеет класс com.huawei.iview.framework.mainframe.MDIFrame, внутри
лежит ProxyFocusOwnerStatic и все, больше ничего нету.
Подскажите в какую сторону ковырять?
Если женщина не права, нужно извиниться и замолчать.
0

#48 Пользователь офлайн   Alex&(R)

  • Новичок
  • Pip
  • Группа: Пользователи
  • Сообщений: 29
  • Регистрация: 05 Август 09

Отправлено 15 Август 2009 - 23:37

Насколько понял, класс главного окна программы - "com.huawei.iview.framework.mainframe.MDIFrame". Класс его дочернего окна - "ProxyOnwerFocusStatic", и больше дочерних окон нет.
Вопрос: Находили окна методом:
curHwnd = GetWindow(Hwnd, GW_HWNDFIRST);
while(curHwnd != 0) {
  ...
  childHwnd = GetWindow(curHwnd, GW_HWNDCHILD);
  while(childHwnd != 0) {
	...
	childHwnd = GetWindow(childHwnd, GW_HWNDNEXT);
  }
  curHwnd = GetWindow(curHwnd, GW_HWNDNEXT);
}

Возможно, дочернее окно содержит еще дочерние окна...
0

#49 Пользователь офлайн   schlager

  • Старожил
  • PipPipPipPipPip
  • Группа: Пользователи
  • Сообщений: 2 090
  • Регистрация: 21 Июль 09

Отправлено 16 Август 2009 - 16:15

Просмотр сообщенияAlex&(R) (15.8.2009, 23:37):

Возможно, дочернее окно содержит еще дочерние окна...

Да, лучше всего спец. прогами посмотреть иерархию окон объекта.
0

#50 Пользователь офлайн   Пьер нацист

  • Активный пользователь
  • PipPipPip
  • Группа: Пользователи
  • Сообщений: 695
  • Регистрация: 12 Февраль 09

Отправлено 17 Август 2009 - 02:30

удалено
Скрытый текст
0

#51 Пользователь офлайн   Saray

  • Старожил
  • PipPipPipPipPip
  • Группа: Пользователи
  • Сообщений: 2 388
  • Регистрация: 31 Январь 08

Отправлено 18 Август 2009 - 09:08

Просмотр сообщенияAlex&(R) (16.8.2009, 0:37):

Насколько понял, класс главного окна программы - "com.huawei.iview.framework.mainframe.MDIFrame". Класс его дочернего окна - "ProxyOnwerFocusStatic", и больше дочерних окон нет.
Вопрос: Находили окна методом:
curHwnd = GetWindow(Hwnd, GW_HWNDFIRST);
while(curHwnd != 0) {
  ...
  childHwnd = GetWindow(curHwnd, GW_HWNDCHILD);
  while(childHwnd != 0) {
	...
	childHwnd = GetWindow(childHwnd, GW_HWNDNEXT);
  }
  curHwnd = GetWindow(curHwnd, GW_HWNDNEXT);
}

Возможно, дочернее окно содержит еще дочерние окна...

нет, через FindWindowEx
Видимо прога построена не на компонентах "оконного" типа, а каких то своих поделках.
Поскольку там своя оригинальная отрисовка, не работают стандартные виндовые ctrl-c ctrl-v

Просмотр сообщенияschlager (16.8.2009, 17:15):

Да, лучше всего спец. прогами посмотреть иерархию окон объекта.

посоветуйте пож-ста толковую прогу :rolleyes:
Если женщина не права, нужно извиниться и замолчать.
0

#52 Пользователь офлайн   Explorer

  • Активный пользователь
  • PipPipPip
  • Группа: Пользователи
  • Сообщений: 699
  • Регистрация: 09 Ноябрь 07

Отправлено 18 Август 2009 - 15:39

Saray
TLabel в VCL самостоятельно тоже текст выводит, вероятно перехват DrawText/TextOut и т.д поможет только. Похоже здесь такая же реализация, поэтому стандартные функции текст не получат простой отправкой сообщения типа WM_GETTEXT и т.п. Возможно также для фреймворка есть какие-то свои особые сообщения в этом плане. :)
Если уж так сильно надо, посмотри через WinSpy иерархию окон.
0

#53 Пользователь офлайн   schlager

  • Старожил
  • PipPipPipPipPip
  • Группа: Пользователи
  • Сообщений: 2 090
  • Регистрация: 21 Июль 09

Отправлено 19 Август 2009 - 02:19

Просмотр сообщенияSaray (18.8.2009, 9:08):

посоветуйте пож-ста толковую прогу :rolleyes:

Ну, например, вот эта http://s0m.narod.ru/iws.html
Не смотрите, что сайт на народе... Правда именно эту версию я не скачивал, но другие проги InqSoft (со встроенным сканером окон) оставили приятное впечатление.
Я и сам делал одну такую прогу - она иерархию окон того или иного объекта выводила в виде наглядного древовидного графика. Но комп как-то раз полетел, а прога больше нигде не была сохранена... :(
0

#54 Пользователь офлайн   Saray

  • Старожил
  • PipPipPipPipPip
  • Группа: Пользователи
  • Сообщений: 2 388
  • Регистрация: 31 Январь 08

Отправлено 20 Август 2009 - 14:25

Просмотр сообщенияschlager (19.8.2009, 3:19):

Ну, например, вот эта http://s0m.narod.ru/iws.html
Не смотрите, что сайт на народе... Правда именно эту версию я не скачивал, но другие проги InqSoft (со встроенным сканером окон) оставили приятное впечатление.
Я и сам делал одну такую прогу - она иерархию окон того или иного объекта выводила в виде наглядного древовидного графика. Но комп как-то раз полетел, а прога больше нигде не была сохранена... :(

Показывает тоже самое, что и моя. Хуавей одним словом...

Просмотр сообщенияExplorer (18.8.2009, 16:39):

Saray
TLabel в VCL самостоятельно тоже текст выводит, вероятно перехват DrawText/TextOut и т.д поможет только. Похоже здесь такая же реализация, поэтому стандартные функции текст не получат простой отправкой сообщения типа WM_GETTEXT и т.п. Возможно также для фреймворка есть какие-то свои особые сообщения в этом плане. :)
Если уж так сильно надо, посмотри через WinSpy иерархию окон.

Да уж больно как то заморочено, мы пойдем другим путем - надо попробовать через сеть перехватывать пакеты этой проги :P
Если женщина не права, нужно извиниться и замолчать.
0

#55 Пользователь офлайн   Hikkikomori

  • Новичок
  • Pip
  • Группа: Пользователи
  • Сообщений: 31
  • Регистрация: 17 Декабрь 08

Отправлено 28 Август 2009 - 09:57

можно с винапи рисовать текст по обоям рабочего стола, не затрагивая другие окна, как в случае с DC?
smile with the rising sun
0

#56 Пользователь офлайн   schlager

  • Старожил
  • PipPipPipPipPip
  • Группа: Пользователи
  • Сообщений: 2 090
  • Регистрация: 21 Июль 09

Отправлено 28 Август 2009 - 15:41

Можно. Только я уже забыл как :unsure:

/// Хотя там вроде был DC. Но я не помню, чтобы затрагивались другие окна. Там же как - сначала получаешь HWND окна, а затем получаешь его HDC. Как здесь затрагиваются другие окна?

/// Вот нашел пример. По такому принципу и я раньше делал...

Цитата

// TestDeskTop.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "iostream.h"
#include "afxwin.h"

void main()
{
HWND hwnd;
hwnd = GetDesktopWindow();
HDC hdc;
hdc=GetWindowDC(hwnd);
int i;
cin >> i;
CPen pen(PS_SOLID,4,RGB(255,0,0));
SelectObject(hdc,pen);
Ellipse(hdc,-100,-100,100,100);
}

0

#57 Пользователь офлайн   Z*K

  • Пользователь
  • PipPip
  • Группа: Пользователи
  • Сообщений: 130
  • Регистрация: 01 Ноябрь 07

Отправлено 01 Ноябрь 2009 - 18:12

Подскажите пожалуйста, в сторону каких функций копать, чтобы обеспечить поддержку записи CD/DVD... желательно без IMAPI. Заранее спасибо.
0

#58 Пользователь офлайн   одуванчик

  • Пользователь
  • PipPip
  • Группа: Пользователи
  • Сообщений: 161
  • Регистрация: 11 Март 09

Отправлено 01 Ноябрь 2010 - 00:08

Я,вот Что не пойму winApi ,без дополнительно установленных
программ типа visual studio может работать?
И если может, то как создать базовую среду для работы сней.
Помогите кто может.
одуванчик
0

#59 Пользователь офлайн   schlager

  • Старожил
  • PipPipPipPipPip
  • Группа: Пользователи
  • Сообщений: 2 090
  • Регистрация: 21 Июль 09

Отправлено 01 Ноябрь 2010 - 16:28

winapi - это совокупное название системных функций windows. Они хранятся в user32.dll, kernel.dll и т.д. (хотя на самом деле не совсем в них, а поглубже, но для программиста это неважно).
В языке должны быть предусмотрены средства для их подключения и использования.
В С++ для использования winapi нужно подключить заголовочный файл windows.h

Цитата

#include <windows.h>

После этого доступны все функции, константы и типы данных для апи.
Какой компилятор С++ в этом случае неважно, любой поймет. У Visual C++ он свой, а еще есть другие.

А вот у Visual Basic нет таких инклудов. Там свой механизм и каждую функцию надо объявлять отдельно.

Цитата

Private Declare Function GetCursorPos Lib "user32" Alias "GetCursorPos" (lpPoint As POINTAPI) As Long


функция требует аргумент с типом данных POINTAPI

Цитата

Private Type POINTAPI
x As Long
y As Long
End Type


Это что касается непосредственного использования api.
Но любое windows-приложение использует winapi. Как минимум ExitProcess.
И к примеру, тот же Visual Studio. У тебя уже есть форма как начальная заготовка. Не написав ни строчки, ты компилишь и программа запускается и видно окошечко. Ты сам апи не используешь, но в программе апишные функции вызываются - это же windows-приложение. Для создания этой формы вызывается CreateWindowEx, например. Но еще надо показать - Showwindow.
И ты растягиваешь это окно и думаешь никто не замечает?))) Ан нет - GetMessage, TranslateMessage, DispatchMessage и WM_SIZE. И т.д.

Сообщение отредактировал schlager: 02 Ноябрь 2010 - 02:05

1

#60 Пользователь офлайн   одуванчик

  • Пользователь
  • PipPip
  • Группа: Пользователи
  • Сообщений: 161
  • Регистрация: 11 Март 09

Отправлено 04 Ноябрь 2010 - 01:29

Большое спасибо! Но вот только как этот файл подключить?
Чтобы заработали язоковые интерпретаторы.
Раньше проще было:
Вот к примеру,надо тебе вывысти на экран "В Америке 10:00"

Ты поступал так:

5 CLS
10 t =10:00
20 text$ = "В Америке"
30 PRINT text$
40 PRINT t


A,как сделать такие простейшие вещи в по всей видимости в мощнейшем
API-=(ТО БИШЬ в интерфейсе прикладного программированния от MICROSOFT, мне остаётся непонятным. Подскажите ,кто разбирается!
Ночами не сплю.
Если можно то пошагово -пожалуйста..
Моё почтение!!!
одуванчик
0

  • (4 Страниц)
  • +
  • 1
  • 2
  • 3
  • 4
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

2 человек читают эту тему
0 пользователей, 2 гостей, 0 скрытых пользователей