Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.76/17: Рейтинг темы: голосов - 17, средняя оценка - 4.76
John Paramol

Много вопросов по WinAPI

07.05.2011, 19:51. Показов 3584. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Подскажите, пожалуйста
1) Какие нужно задать стили дочернему окну, чтобы оно не было тусклым как будто неактивное
2) Как задать диапазон для изменения размеров окна
3) Как задать область внутри окна, за которую ему можно изменять размеры
4) Пытался создать убогий класс наподобие TForm из VCL. Так вот запарка была в том, что перед созданием окна, при регистрации класса нужно задавать в поле lpfnWndProc из WNDCLASS оконную процедуру, а с функциями-членами этого делать нельзя. Может я туплю сильно, как тогда это реализовано в VCL?

буду рад хоть какому-нибудь совету, пояснению или ссылке на русскоязычный ресурс
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
07.05.2011, 19:51
Ответы с готовыми решениями:

Несколько вопросов по WinAPI
1. Как получать сообщения другого окна? Приложение запускает ИЕ через ShellExecuteA(hWnd,"open",PATH,NULL,NULL,SW_MAXIMIZE), а...

Несколько вопросов по WinApi
1) Как создать окно развернутое на весь экран? 2) Как получить разрешение экрана? 3) Как изменить положение и размер уже созданного...

Зачем в WinApi так много #define, typedef?
Зачем в WinApi так много #define, typedef? Например, в minwindef.h есть строка: typedef int BOOL; Зачем, если можно обойтись...

12
1 / 1 / 2
Регистрация: 05.08.2009
Сообщений: 96
09.05.2011, 01:43
Ограничения по размеру и перемещению можно ограничевать обрабатывая вин месаги WM_MOVING,WM_MOVE,WM_SIZE,WM_SIZING.
А по п.4 оконную процедуру объявить как static
0
0 / 0 / 8
Регистрация: 07.12.2010
Сообщений: 46
11.05.2011, 10:12
Привет.
По 4-му вопросу посмотри здесь:
http://www.softcraft.ru/winapi.shtml
Удачи.
0
John Paramol
31.05.2011, 18:29
Извиняюсь за молчание…

Спасибо
Kovalsky2, все работает,
np_msn, занятная ссылка

если кому-то будет интересно:
насчет дочерних окон п.1 (я имел ввиду MDI children) нашел исходники
http://members.lycos.co.uk/antaresps/windows/mdi_one.zip
http://members.lycos.co.uk/antaresps/windows/mdi_two.zip
стили были ни причем…
насчет п.3:
можно создавать SCROLLBAR функцией CreateWindow[Ex] со стилями SBS_SIZEBOX или SBS_SIZEGRIP,
а можно StatusBar функцией CreateStatusWindow или той же CreateWindowEx из примера по вышеуказанной ссылке #2.

Но может подскажете еще кое-что:
навешал хук на мышиные события, все нормально, но если делать клик на любом меню (своем), начинают лихорадочно сыпаться месаги от dll.
В чем может быть проблема?
John Paramol
01.06.2011, 06:22
в некоторых случаях они перестают сыпаться, если мышь выходит за пределы своего окна
1 / 1 / 2
Регистрация: 05.08.2009
Сообщений: 96
02.06.2011, 16:23
А что за месаги?
0
John Paramol
06.06.2011, 07:45
определенные мной как WM_USER + что-то, то есть, как будто в большом количестве идут события от мыши.
судя по wParam, это WM_LBUTTONDOWN
1 / 1 / 2
Регистрация: 05.08.2009
Сообщений: 96
06.06.2011, 16:08
Так может это всего навсего WM_MOUSEMOVE?
0
John Paramol
06.06.2011, 16:26
это не может быть WM_MOUSEMOVE также как и не может быть WM_LBUTTONDOWN, событий нет, а месаги есть.
Но судя по wParam из функции, которую вызывает хук:
LRESULT CALLBACK MouseProc(DWORD code, WPARAM wParam, LPARAM lParam);
это все-таки WM_LBUTTONDOWN
1 / 1 / 2
Регистрация: 05.08.2009
Сообщений: 96
06.06.2011, 16:31
А можите дать немного кода.А то,так мне ни чего не понять.
0
John Paramol
06.06.2011, 18:29
Дело в том, что у меня одна DLL на ассемблере.
Она посылает сообщения при любом положении мыши:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
// DLL (asm):
 
.386
.model flat,stdcall
option casemap:none
include masm32includewindows.inc
include masm32includekernel32.inc
includelib masm32libkernel32.lib
include masm32includeuser32.inc
includelib masm32libuser32.lib
.const
WM_MOUSEHOOK equ WM_USER+10
.data
hInst dd 0
.data?
hHook dd ?
hWnd dd ?
.code
DllEntry proc hModule:HINSTANCE, reason_for_call:DWORD, lpReserved:DWORD
      push hModule
      pop hInst
      mov eax,TRUE
      ret
DllEntry Endp
MouseProc proc nCode:DWORD,wParam:DWORD,lParam:DWORD
      invoke CallNextHookEx,hHook,nCode,wParam,lParam
      invoke PostMessage,hWnd,WM_MOUSEHOOK,wParam,lParam
      xor eax,eax
      ret
MouseProc endp
InstallHook proc hwnd:DWORD
      push hwnd
      pop hWnd
      invoke SetWindowsHookEx,WH_MOUSE,addr MouseProc,hInst,NULL
      mov hHook,eax
      ret 
InstallHook endp
UninstallHook proc
      invoke UnhookWindowsHookEx,hHook
      ret
UninstallHook endp
End DllEntry
Ее C++ эквивалент работает не совсем корректно, почему-то только в области своего окна (!еще одна проблема!):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
// DLL (C++):
 
#define WM_MOUSEHOOK WM_USER+10;
extern 'C' __declspec(dllexport) void __stdcall InstallHook(HWND);
extern 'C' __declspec(dllexport) void __stdcall UninstallHook();
static LRESULT CALLBACK MouseProc(DWORD, WPARAM, LPARAM);
HHOOK hHook;
HINSTANCE hInstance;
HWND hWnd;
//-------------------------------------------------------------
BOOL APIENTRY DllMain( HANDLE hModule, DWORD reason_for_call, LPVOID lpReserved )
{
  hInstance = (HINSTANCE)hModule;
  return TRUE;
}
//-------------------------------------------------------------
LRESULT CALLBACK MouseProc(DWORD code, WPARAM wParam, LPARAM lParam)
{
  CallNextHookEx(hHook, code, wParam, lParam);
  PostMessage(hWnd,WM_MOUSEHOOK,wParam,lParam);
  return FALSE;
}
//-------------------------------------------------------------
void __stdcall InstallHook(HWND hwnd)
{
  hWnd=hwnd;
  hHook = SetWindowsHookEx(WH_MOUSE,(HOOKPROC)(MouseProc), hInstance, 0);
}
//-------------------------------------------------------------
void __stdcall UninstallHook()
{
  UnhookWindowsHookEx(hHook);
}
//-------------------------------------------------------------
приложение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
// Application:
 
#define WM_MOUSEHOOK WM_USER+10;
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int)
{
  MSG  msg;
  WNDCLASSEX WndClassEx;
  ...
  WndClassEx.lpfnWndProc = WndProc;
  ...
  RegisterClassEx(&WndClassEx);
  CreateWindowEx(0, MainWinClassName, NULL
                 WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_VISIBLE,
                 CW_USEDEFAULT, 0, CW_USEDEFAULT, 0,
                 NULL, NULL, hInstance, NULL);
  while(::GetMessage(&msg, NULL, 0, 0))
  {
    ::TranslateMessage(&msg);
    ::DispatchMessage(&msg);
  }
  return msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam)
{
  typedef void __stdcall (*InstallHook)(HWND);
  typedef void __stdcall (*UninstallHook)();
  static InstallHook InstHook;
  static UninstallHook UninstHook;
  static HMODULE hLib;
  switch(Message)
  {
    case WM_CREATE:
      hLib = LoadLibrary('mhook.dll'); 
      InstHook=(InstallHook)GetProcAddress(hLib,'InstallHook');
      UninstHook=(UninstallHook)GetProcAddress(hLib,'UninstallHook');
      return 0;
    case XX_INSTALL_HOOK:
1 / 1 / 2
Регистрация: 05.08.2009
Сообщений: 96
13.06.2011, 02:33
Набросал сишный эквивалент,действительно работает странно.
C++
1
2
3
4
5
6
7
//-------------------------------------------------------------
void __stdcall InstallHook(HWND hwnd)
{
 hWnd=hwnd;
 hHook = SetWindowsHookEx(WH_MOUSE,(HOOKPROC)(MouseProc), hInstance, 0);
}
//---
Если всесто нулевого id процесса поставить GetCurrentThreadId(),
работает лучьше,но только в области своего окна.
Если нулевое id процесса,то работает хитрее:
когда мышка вы ходит за область окна,то MouseProc срабатывает,но
hWnd равняеться НУЛЮ!Почему так получаеться пока не сообразил.;(

Вобщем-то,ни кто нам не запрещает использовать id нулевого процесса,
но на сколько это корректно!?
0
John Paramol
17.06.2011, 12:22
в эквиваленте если поменять PostMessage на SendMessage исчезает проблема с менюшками (не соображу, как ето получается), проблема с окном остается.
в asm проверить пока не могу, компилятор потерял
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
17.06.2011, 12:22
Помогаю со студенческими работами здесь

Много вопросов..
Всем привет! Сразу оговорюсь, Лотусом занимаюсь всего неделю, но требований уже очень много, итак.. Вопросы: 1. Как из представления при...

Много вопросов
Приветсвую всех. В-общем, балуюсь сайтами в качестве хобби, а так работаю и учусь совсем в другой сфере. Все началось с того, что для...

Много вопросов
Здравствуйте, доброго времени суток! Как бы я литературу читал, и так, и у вас на форуме, SEO начал заниматься где-то с нового года,...

Много вопросов
Вопрос 1: Есть ли в SQL такое понятие как, определение имен таблиц. Типа есть БД и в ней нужно узнать сколько существует таблиц и вывести...

Много вопросов
ребят подскажите как зделать Panel прозрачной а текст который в ней есть осталься видимым


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru