I think the standard response here is to call upon two particular parts of the Frege/Russell tradition - the first being the concept of a Proposition (SEP) and the second being the concept of Logical Form (another SEP).
Consider a simple question like "Is it raining outside?". One way to go about working out what it is that this question is asking is to try to determine under what conditions would this question receive an affirmative answer, and what would receive a negative answer. Naturally, we would say that it would be answered affirmatively if, and only if, it is raining outside, and negatively if, and only if, it is not raining outside.
Now in one interpretation of the analytic philosophical project, what we're doing is constructing a theory of propositions (that we take to represent the bearers of semantic value) in a formal framework, and then using this theory to further interpret assertion more generally by saying that the logical form of a statement or argument reduces to the expression of either propositions or of relations featuring at least propositions and speakers as constitutive elements.
The logical form of my question then will feature the proposition "It is raining outside" as a proper part. Is there something else that might be necessary here? Well, perhaps we might also add that in asking a question, I (the speaker) am addressing this question to you (a prospective answerer), in a manner which suggests that I do not know the answer but hope/believe that you do and want you to tell me if you do.
So. Let's suppose we have a proposition-forming operator 'k' to form a proposition [k] from the sentence k. Perhaps a candidate for a correct logical form of "Is it raining outside?" asked by A to B would be something like this:
¬knowsThat(A,'it is raining outside') ^ ¬knowsThat(A,¬'it is raining outside')
^ believesThat(A,knowsThat(B,'it is raining outside') v knowsThat(B,¬'it is raining outside'))
^ (desiresThat(A,
knowsThat(B,'it is raining outside') -> asserts(B,'it is raining outside')
^ knowsThat(B,¬'it is raining outside') -> asserts(B,¬'it is raining outside')
)
A bit unwieldy perhaps, but then that's why we have natural language to simplify all of this!