Avatar billede mollevp Nybegynder
29. september 2004 - 00:04 Der er 9 kommentarer og
1 løsning

DialogBox problem

Hej.. Jeg har siddet og rodet med mine dialoger, og er stødt ind i et problem.

Først lidt info jeg koder ANSI C win32 API, min WinMain ser ud som følger:

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
    LPSTR lpCmdLine, int nCmdShow)
{
    return DialogBox(hInstance, MAKEINTRESOURCE(IDD_DlgMain), NULL, DlgMain);
}

Problemet består så i at jeg ikke kan anvende keyboardet i forbindelse med dialogen.. Den er modal(DialogBox) og jeg kan se den reagere på de specielle taster(ALT, ENTER osv), men den reagere overhovedt ikke på andre taster fx a,b,3,2 osv.

Kan man fange keyboard inputtet på en eller anden måde... Jeg kunne specielt godt tænke mig at få adgang til piltasterne, gerne gennem en WM_KEYDOWN eller en af de andre...

Håber i kan hjælpe
Avatar billede bertelbrander Novice
29. september 2004 - 00:27 #1
Det er ikke ret let at fange alle tastetryk med en almindelig dialog box.

Message loop'en i DialogBox(...) synes at den skal bestemme hvilke taste tryk du skal have adgang til.

Man kunne prøve at udskifte WinProc for dialogboxen ved at kalde GetWindowLong, og derved få fat i beskederne inden den almindelige winproc får fat i dem.
Avatar billede mollevp Nybegynder
29. september 2004 - 00:57 #2
Kan du uddybe det lidt...

Kan man da måske bruge DWL_MSGRESULT med GetWindowLong() eller?
Avatar billede mollevp Nybegynder
29. september 2004 - 01:06 #3
Hej igen, jeg faldt lige over noget der måske kunne bruges:

"The system supports many different types of hooks; each type provides access to a different aspect of its message-handling mechanism. For example, an application can use the WH_MOUSE Hook to monitor the message traffic for mouse messages."

Det ser ud til at det sammen skulle kunne lade sig gøre med keyboardet... Jeg vil lige kigge på det igen imorgen..
Avatar billede bertelbrander Novice
29. september 2004 - 01:08 #4
Den sidste metode er mest til at lave "globale" hooks, dvs for hooks der skal virke med alle programmer.
Avatar billede mollevp Nybegynder
29. september 2004 - 01:50 #5
ok.. Jeg sad og snakkede med en på IRC i #C.. Han foreslog GetAsyncKeyState();

Lurer også lidt på om CreateDialogParam(Er vist mere som et normalt vindue) kan bruges istedet for DialogBox, men nu skal jeg vist have lidt søvn.. Kigger på dem imorgen..

Men tak for indtil videre :)
Avatar billede bertelbrander Novice
29. september 2004 - 23:37 #6
Jeg tror at CreateDialogParam (eller CreateDialog) er løsningen, f.ex. noget i stil med:

#include <windows.h>
#include <stdio.h>

#define IDD_DLGMAIN 100

BOOL CALLBACK DlgMain(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
  if(uMsg == WM_COMMAND && LOWORD(wParam) == IDOK)
  {
      EndDialog(hwndDlg, 0);
      return TRUE;
  }
  return FALSE;
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
  MSG msg;
  HWND hwnd = CreateDialogParam(hInstance, MAKEINTRESOURCE(IDD_DLGMAIN), 0, DlgMain, 0);

  while(GetMessage(&msg, NULL, 0, 0))
  {
      if(msg.message == WM_KEYDOWN && msg.wParam == 'P')
      {
        MessageBox(0, "You hit the P key", "+++", MB_OK);
      }
      if(!IsDialogMessage(hwnd, &msg))
      {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
      }
  }
  return 0;
}
Avatar billede mollevp Nybegynder
30. september 2004 - 00:00 #7
Det ser fornuftigt ud!
Tror og det bliver noget med en modeless dialog.. Jeg prøver igen - tak for bidraget..
Avatar billede mollevp Nybegynder
27. februar 2005 - 12:27 #8
Kan du ikke ligge et svar bertel - så lukker jeg... :)
Avatar billede bertelbrander Novice
07. marts 2005 - 22:43 #9
Jeg samler ikke på point.
Avatar billede mollevp Nybegynder
07. marts 2005 - 23:01 #10
så lukker jeg selv - men tak for hjælpen..
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester